2010-11-18 81 views
9

我有一個需要運行長時間計算的GUI應用程序(想一分鐘或更長時間),它處理這個問題的方式是通過給後臺工作人員進行計算。 (這部分是罰款)哪個線程做backgroundworker完成事件處理程序運行?

我的問題是,如果我這樣做: this.backgroundWorker.RunWorkerCompleted + =新System.ComponentModel.RunWorkerCompletedEventHandler(this.doSomethingElse);

doSomethingElse將在主UI線程上運行,還是在後臺工作線程運行的線程池中運行?

感謝您提供的任何幫助。

+1

你可以寫的'System.Threading.Thread.CurrentThread.ManagedThreadId'在'UI','DoWork'和'WorkCompleted'輸出窗口,以確認 – PostMan 2010-11-18 22:42:03

回答

6

它將在Ba​​ckgroundWorker所在的同一線程中運行,即通常是UI線程。

+0

OK(確定)第二部分,但Bgw(或任何其他對象)不是「在一個線程中」。 – 2010-11-18 22:44:52

+1

對不起,產生它的線程本來是一個更好的措辭 – Homde 2010-11-18 23:00:45

+0

這實際上帶來了一個有趣的觀點..如果在Windows窗體應用程序中使用可視化GUI設計器來聲明BackgroundWorker,那麼實際的BackgroundWorker對象是否會以堆棧的UI線程或堆? – 2010-11-19 15:57:17

5

是doSomethingElse將要在主UI線程

是的,這是成爲了一個BackgroundWorker的主要原因上運行。它有3個事件,只有DoWork將在單獨的(ThreadPool)線程上執行。 Completed和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事件。但是,我的單元測試失敗,只要從後臺線程調用Completed事件,而不是從主測試線程調用 – 2014-12-15 07:36:56