为了账号安全,请及时绑定邮箱和手机立即绑定

BackgroundWorker RunWorkerCompleted事件

BackgroundWorker RunWorkerCompleted事件

暮色呼如 2019-09-26 11:03:53
我的C#应用程序有几个后台工作人员。有时,一名后台工作者会解雇另一名。当第一个后台工作人员完成并且RunWorkerCompleted事件被触发时,该事件将在哪个线程上触发,UI或从哪个线程RunWorkerAsync调用?我正在使用Microsoft Visual C#2008 Express Edition。您可能有任何想法或建议。谢谢。
查看完整描述

3 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

如果BackgroundWorker是从UI线程创建的,则RunWorkerCompleted事件还将在UI线程上引发。

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

有趣的是,这似乎并没有在MSDN上得到充分记录。我能够找到的最佳参考是在这里

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


查看完整回答
反对 回复 2019-09-26
?
慕容森

TA贡献1853条经验 获得超18个赞

这是不对的。如果UI线程创建了BGW实例,它将仅在UI线程上引发。如果线程创建了BGW,则它将在任意线程池线程上引发。 

查看完整回答
反对 回复 2019-09-26
?
慕容3067478

TA贡献1773条经验 获得超3个赞

另外,我们也感到困惑,因为您还必须从主线程调用RunWorkerAsync。那是最重要的。我们有一个计时器来收集BGW并将其启动。System.Timers.Timer和System.Windows.Forms.Timer之间的区别是从主线程和随机线程调用的OnWorkerCompleted之间的区别。System.Timers.Timer事件不会在主线程上调用。

查看完整回答
反对 回复 2019-09-26
  • 3 回答
  • 0 关注
  • 1044 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信