3 回答

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果BackgroundWorker
是從UI線程創(chuàng)建的,則RunWorkerCompleted
事件還將在UI線程上引發(fā)。
如果是從后臺(tái)線程創(chuàng)建的,則事件將在未定義的后臺(tái)線程上引發(fā)(不一定是同一線程,除非您使用custom SynchronizationContext
)。
有趣的是,這似乎并沒(méi)有在MSDN上得到充分記錄。我能夠找到的最佳參考是在這里:
在您的應(yīng)用程序中實(shí)現(xiàn)多線程的首選方法是使用BackgroundWorker組件。的BackgroundWorker的組件使用多線程的事件驅(qū)動(dòng)模型。后臺(tái)線程運(yùn)行您的DoWork事件處理程序,而創(chuàng)建控件的線程運(yùn)行您的ProgressChanged和RunWorkerCompleted事件處理程序。您可以從ProgressChanged和RunWorkerCompleted事件處理程序中調(diào)用控件。

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊
這是不對(duì)的。如果UI線程創(chuàng)建了BGW實(shí)例,它將僅在UI線程上引發(fā)。如果線程創(chuàng)建了BGW,則它將在任意線程池線程上引發(fā)。

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊
另外,我們也感到困惑,因?yàn)槟€必須從主線程調(diào)用RunWorkerAsync。那是最重要的。我們有一個(gè)計(jì)時(shí)器來(lái)收集BGW并將其啟動(dòng)。System.Timers.Timer和System.Windows.Forms.Timer之間的區(qū)別是從主線程和隨機(jī)線程調(diào)用的OnWorkerCompleted之間的區(qū)別。System.Timers.Timer事件不會(huì)在主線程上調(diào)用。
- 3 回答
- 0 關(guān)注
- 1140 瀏覽
添加回答
舉報(bào)