2010-05-10 43 views
25

我的C#應用​​程序有幾個後臺工作者。有時候一名後臺工作人員會開火。當第一個後臺工作人員完成並觸發RunWorkerCompleted事件時,該事件將在哪個線程觸發,UI或調用RunWorkerAsync的第一個後臺工作人員?我正在使用Microsoft Visual C#2008速成版。任何想法或建議,你可能會感激。謝謝。BackgroundWorker RunWorkerCompleted事件

回答

57

如果BackgroundWorker是從UI線程創建的,那麼RunWorkerCompleted事件也將在UI線程上引發。

如果它是從後臺線程創建的,則該事件將在未定義的後臺線程上引發(不一定是相同的線程,除非您使用自定義SynchronizationContext)。

有趣的是,這似乎並沒有在MSDN上記錄得很清楚。最好的參考我能夠找到的是here

來實現應用程序中的多線程的首選方法是使用BackgroundWorker組件。 BackgroundWorker組件使用事件驅動的多線程模型。 後臺線程運行您的DoWork事件處理程序,並且創建您的控件的線程運行您的ProgressChangedRunWorkerCompleted事件處理程序。您可以從您的ProgressChangedRunWorkerCompleted事件處理程序調用您的控件。

+0

這是控制被實例化的地方嗎?我所有的後臺工作人員都可以在默認的'InitializeComponent()'函數中從UI線程實例化(假定)。 – 2010-05-10 22:19:30

+0

@Jim:是的,對原文的措辭稍差;它實際上是創建將接收事件的'BackgroundWorker'的線程,並且您必須從同一個線程調用'RunWorkerAsync'。爲了理智的目的,通常應該是UI線程。 – Aaronaught 2010-05-10 22:21:08

+8

這是不正確的。它只會在UI線程創建BGW實例時纔會在UI線程中產生。如果一個線程創建了BGW,那麼它將在任意線程池線程上產生。 – 2010-05-11 03:26:00

相關問題