web-dev-qa-db-ja.com

BackgroundWorkerRunWorkerCompletedイベント

私のC#アプリケーションには、いくつかのバックグラウンドワーカーがいます。時々、あるバックグラウンドワーカーが別のバックグラウンドワーカーを解雇します。最初のバックグラウンドワーカーが完了してRunWorkerCompletedイベントが発生すると、そのイベントはどのスレッドで発生しますか、UIまたはRunWorkerAsyncが呼び出された最初のバックグラウンドワーカーですか。 Microsoft Visual C#2008 ExpressEditionを使用しています。あなたが持っているかもしれないどんな考えや提案もいただければ幸いです。ありがとう。

28
Jim Fell

BackgroundWorkerがUIスレッドから作成された場合、RunWorkerCompletedイベントもUIスレッドで発生します。

バックグラウンドスレッドから作成された場合、イベントは未定義のバックグラウンドスレッドで発生します(カスタムSynchronizationContextを使用している場合を除き、必ずしも同じスレッドである必要はありません)。

興味深いことに、これはMSDNで十分に文書化されているようには見えません。私が見つけた最高のリファレンスは ここ

アプリケーションにマルチスレッドを実装するための推奨される方法は、 BackgroundWorker コンポーネントを使用することです。 BackgroundWorker コンポーネントは、マルチスレッドにイベント駆動型モデルを使用します。 バックグラウンドスレッドは DoWork イベントハンドラーを実行し、コントロールを作成するスレッドは ProgressChanged および RunWorkerCompleted を実行します=イベントハンドラー。ProgressChanged および RunWorkerCompleted イベントハンドラーからコントロールを呼び出すことができます。

60
Aaronaught