BackgroundWorker完成事件处理程序在哪个线程上运行?

12

我有一个GUI应用程序需要运行长时间的计算(大约一分钟或更长时间),它通过将计算交给后台工作器来处理。 (这部分没问题)

我的问题是,如果我做以下操作:

this.backgroundWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.doSomethingElse);

那么doSomethingElse会在主UI线程上运行,还是在后台工作器所在的线程池中运行?

感谢您提供的任何帮助。


2
你可以在 UIDoWorkWorkCompleted 中将 System.Threading.Thread.CurrentThread.ManagedThreadId 写入输出窗口以确认。 - PostMan
3个回答

6

它将在与BackgroundWorker相同的线程中运行,即通常是UI线程。


可以进行第二部分,但是 Bgw(或任何其他对象)并不是“在线程中”。 - H H
1
对不起,生成它的线程可能有更好的措辞。 - Homde
这实际上提出了一个有趣的问题...如果您在Windows窗体应用程序中使用可视化GUI设计器声明BackgroundWorker,那么实际的BackgroundWorker对象是在UI线程的堆栈上还是堆上? - chuck taylor
据我所知,真正创建后台工作的线程并不重要。它将通过执行上下文某种方式找到MessagePump。或者类似这样的东西。 - H H
尽管如此,我仍然有时会发现在Completed()方法内显示对话框或执行UI控件操作时出现跨线程错误。我觉得我仍然需要检查InvokeRequired并使用Invoke()来确保。 - PandaWood

5

doSomethingElse会在主UI线程上运行吗?

是的,这就是Backgroundworker存在的主要原因。它有3个事件,只有DoWork会在单独的(线程池)线程上执行。Completed和ProgressChanged将被调度到“主”线程上。


4

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Subtle Fox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接