BackgroundWorker RunWorkerCompleted事件

Jim*_*ell 26 .net c# events multithreading backgroundworker

我的C#应用​​程序有几个后台工作者.有时候一个后台工作人员会开火.当第一个后台工作程序完成并RunWorkerCompleted触发事件时,该事件将触发哪个线程,UI或从中RunWorkerAsync调用的第一个后台工作程序?我使用的是Microsoft Visual C#2008 Express Edition.任何您可能有的想法或建议将不胜感激.谢谢.

Aar*_*ght 60

如果BackgroundWorker是从UI线程创建的,那么该RunWorkerCompleted事件也将在UI线程上引发.

如果它是从后台线程创建的,则事件将在未定义的后台线程上引发(不一定是相同的线程,除非您使用自定义SynchronizationContext).

有趣的是,这似乎并没有完全记录在MSDN上.最好的参考我能够找到的是在这里:

在应用程序中实现多线程的首选方法是使用BackgroundWorker组件.的BackgroundWorker的组件使用多线程的事件驱动模型.后台线程运行您的DoWork事件处理程序,创建控件的线程运行ProgressChangedRunWorkerCompleted事件处理程序.您可以从ProgressChangedRunWorkerCompleted事件处理程序调用控件.

  • 这是不正确的.如果UI线程创建了BGW实例,它将仅在UI线程上引发.如果一个线程创建了BGW,那么它将在任意线程池线程上引发. (8认同)
  • "将在同一个线程上引发",而不是如果它没有在UI线程上创建的话.不可能对任意线程进行编组调用,只有UI线程具有所需的管道.需要WindowsFormsSynchronizationContext或DispatcherSynchronizationContext提供程序,默认提供程序(SynchronizationContext)在线程池线程上进行回调. (4认同)
  • 此外,我们感到困惑,因为您还必须从主线程调用RunWorkerAsync.这是最重要的.我们有一个计时器来收集BGW并启动它们.System.Timers.Timer和System.Windows.Forms.Timer之间的区别在于从主线程和随机线程调用的OnWorkerCompleted之间的区别.不在主线程上调用System.Timers.Timer事件. (2认同)