2010-11-18 11 views
9

私は、長い計算(1分以上考える)を実行する必要のあるGUIアプリケーションを持っており、これを処理する方法はバックグラウンドワーカーに計算を渡すことです。私はのような何かをする場合、私は持っている疑問があるスレッドはbackgroundworkerが完了したイベントハンドラを実行しますか?

(この部分は結構です):this.backgroundWorker.RunWorkerCompleted + =新しいSystem.ComponentModel.RunWorkerCompletedEventHandler(this.doSomethingElse) 。

doSomethingElseは、バックグラウンドワーカーが上走ったスレッドプール内のメインUIスレッドまたは任意の上で実行されようとしていますか?

ご協力いただきありがとうございます。

+1

あなたはには、[OK] – PostMan

答えて

6

すなわち、BackgroundWorkerのは、中にあるのと同じスレッドで実行されるように、ほとんどの通常のUIスレッドを起こっています。

+0

を確認するために、 'UI'、' DoWork'と 'WorkCompleted'での出力ウィンドウに' System.Threading.Thread.CurrentThread.ManagedThreadId'を書くことができ2番目の部分ですが、Bgw(または他のオブジェクト)は 'スレッド内'ではありません。 –

+1

申し訳ありませんが、それを生み出したスレッドは、より良い言葉遣いでした。 – Homde

+0

これは実際に興味深いポイントをもたらします.WindowsフォームアプリケーションでビジュアルGUIデザイナを使用してBackgroundWorkerを宣言すると、実際のBackgroundWorkerオブジェクトはUIスレッドまたはヒープのスタック? –

5

doSomethingElseはい、それはBackgroundWorkerのためであることの主な理由であるメインUIスレッド

上で実行されようとしています。 3つのイベントがあり、DoWorkだけが別の(ThreadPool)スレッド上で実行されます。完了し、ProgressChangedは「メイン」スレッドにマーシャリングされます。

4

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

それがバックグラウンドスレッドから作成された場合、イベントが未定義のバックグラウンドスレッドで発生します。

詳細については、この記事とこの接続の問題を参照してください。

https://stackoverflow.com/a/2806824/279999

http://connect.microsoft.com/VisualStudio/feedback/details/116930/backgroundworker-components-progresschanged-and-runworkercompleted-event-run-on-wrong-thread

+0

確かに!私のアプリケーションが正常に動作したときに初めてこの事実を混乱させ、完了したイベントはメインのUIスレッドから呼び出されました。しかし、私の単体テストは、主テストスレッドからではなく、バックグラウンドスレッドから呼び出されたCompletedイベントまで失敗しました。 –

関連する問題