私はさらに非同期タスクを呼び出す必要がある非同期操作に取り組んでいます。 BackgroundWorkersを使用することでシンプルにしています。その結果、BackgroundWorkerのDoWork()コールバックは、2番目のBackgroundWorkerを作成するメソッドを呼び出します(エラーチェックを省略し、すべてのジャズを簡潔にする)。ネストされたBackgroundWorkers:間違ったスレッドでRunWorkerCompletedが呼び出されましたか?
問題は、私はClass2._Worker_RunWorkerCompleted()がClass2.DoSomethingElseAsync()が呼び出された同じスレッドで実行されることを期待しています。これは決して起こりません。代わりに、全く新しいスレッドでコールバックが実行されます。
Class1の_worker_DoWork()は返されません。これはスレッドが存在していても、スレッドがイベントリスナーに戻ってこないことを意味します。一方、_worker_DoWork()が返された場合、Class1のBackgroundWorkerは自動的に途中で終了するため、Class2が作業を終了するまでClass2が終了するまで待つ必要があります。二つの質問につながる
:
- は正しい私の疑いですか?
- このような非同期操作をネストする最も良い方法は何ですか? BackgroundWorkerのアプローチを救済することはできますか、それとも他のより適切な手法がありますか?
ありがとう、それは間違いなく正しい方向に私を指摘しました。このジョブを処理するには、「イベントベースの非同期パターン」(http://msdn.microsoft.com/en-us/library/wewwczdw%28v=VS.90%29.aspx)を実装する必要があります。これは、BackgroundWorkerの代わりにAsyncOperationクラスを使用するため、メッセージがどの同期コンテキストに送られるかをいくらか制御できます。 –