我的C#应用程序有几个后台工作者。有时候一个后台工作人员会开火。当第一个后台工作程序完成并触发RunWorkerCompleted
事件时,该事件将触发哪个线程,UI或从中调用RunWorkerAsync
的第一个后台工作程序?我使用的是Microsoft Visual C#2008 Express Edition。任何您可能有的想法或建议将不胜感激。感谢。
答案 0 :(得分:60)
如果从UI线程创建了BackgroundWorker
,那么也会在UI线程上引发RunWorkerCompleted
事件。
如果它是从后台线程创建的,则事件将在未定义的后台线程上引发(不一定是相同的线程,除非您使用自定义SynchronizationContext
)。
有趣的是,这似乎并没有在MSDN上详细记录。我能找到的最佳参考是here:
在您的应用程序中实现多线程的首选方法是使用BackgroundWorker组件。 BackgroundWorker组件使用事件驱动的模型进行多线程处理。 后台线程运行您的DoWork事件处理程序,创建控件的线程会运行您的ProgressChanged和RunWorkerCompleted事件处理程序。您可以从您的控件中调用控件ProgressChanged和RunWorkerCompleted事件处理程序。
答案 1 :(得分:0)
根据我的观察,RunWorkerCompleted 是在调用 RunWorkerAsync 的线程上执行的,该线程不一定是创建后台工作线程的线程。