我的C#應用程序有幾個後臺工作者。有時候一名後臺工作人員會開火。當第一個後臺工作人員完成並觸發RunWorkerCompleted
事件時,該事件將在哪個線程觸發,UI或調用RunWorkerAsync
的第一個後臺工作人員?我正在使用Microsoft Visual C#2008速成版。任何想法或建議,你可能會感激。謝謝。BackgroundWorker RunWorkerCompleted事件
25
A
回答
57
如果BackgroundWorker
是從UI線程創建的,那麼RunWorkerCompleted
事件也將在UI線程上引發。
如果它是從後臺線程創建的,則該事件將在未定義的後臺線程上引發(不一定是相同的線程,除非您使用自定義SynchronizationContext
)。
有趣的是,這似乎並沒有在MSDN上記錄得很清楚。最好的參考我能夠找到的是here:
來實現應用程序中的多線程的首選方法是使用BackgroundWorker組件。 BackgroundWorker組件使用事件驅動的多線程模型。 後臺線程運行您的DoWork事件處理程序,並且創建您的控件的線程運行您的ProgressChanged和RunWorkerCompleted事件處理程序。您可以從您的ProgressChanged和RunWorkerCompleted事件處理程序調用您的控件。
相關問題
- 1. BackgroundWorker的不加RunWorkerCompleted事件
- 2. 如何使用BackgroundWorker事件RunWorkerCompleted
- 3. BackgroundWorker不會觸發RunWorkerCompleted事件
- 4. Backgroundworker runworkercompleted not firing
- 5. BackgroundWorker not firing RunWorkerCompleted
- 6. 的BackgroundWorker RunWorkerCompleted在組件
- 7. BackgroundWorker中的ShowDialog RunWorkerCompleted
- 8. backgroundworker not firing RunWorkerCompleted event
- 9. 的BackgroundWorker:出現InvalidOperationException在RunWorkerCompleted
- 10. WP7一個RunWorkerCompleted事件觸發兩個BackgroundWorker對象
- 11. 爲什麼一個異常不能在BackgroundWorker的RunWorkerCompleted事件
- 12. VBNet BackGroundWorker在RunWorkerCompleted事件中傳遞參數
- 13. 定時器停止時調用BackgroundWorker RunWorkerCompleted事件
- 14. BackgroundWorker停止將異常傳遞到RunWorkerCompleted
- 15. 運行的BackgroundWorker在RunWorkerCompleted的WinForms .NET
- 16. RunWorkerCompleted異步無效的DoWork事件
- 17. Backgroundworker的RunWorkerCompleted事件甚至在完成工作之前就被觸發
- 18. 在不使用RunWorkerCompleted事件的情況下檢查BackgroundWorker的狀態
- 19. 背景RunworkerCompleted事件不會觸發VSTA_Main主題:Excel VSTO插件
- 20. BackgroundWorker ReportProgress事件隊列
- 21. 訂閱事件的Backgroundworker
- 22. BackgroundWorker事件未觸發
- 23. BackgroundWorker事件處理程序
- 24. 我可以在BackgroundWorker的RunWorkerCompleted()中調用RunWorkerAsync()嗎?
- 25. C#BackgroundWorker跳過DoWork並直接進入RunWorkerCompleted
- 26. 使用匿名方法定義backgroundworker的RunWorkerCompleted?
- 27. 在BackgroundWorker中:RunWorkerCompleted的e.Error == null即使在出錯的情況下
- 28. WPF BackgroundWorker過程RunWorkerCompleted被多次調用,爲什麼?
- 29. `RunWorkerCompleted`不總是被解僱
- 30. BackgroundWorker Thread - C#
這是控制被實例化的地方嗎?我所有的後臺工作人員都可以在默認的'InitializeComponent()'函數中從UI線程實例化(假定)。 – 2010-05-10 22:19:30
@Jim:是的,對原文的措辭稍差;它實際上是創建將接收事件的'BackgroundWorker'的線程,並且您必須從同一個線程調用'RunWorkerAsync'。爲了理智的目的,通常應該是UI線程。 – Aaronaught 2010-05-10 22:21:08
這是不正確的。它只會在UI線程創建BGW實例時纔會在UI線程中產生。如果一個線程創建了BGW,那麼它將在任意線程池線程上產生。 – 2010-05-11 03:26:00