2

在最后一个问题中,在 C# 中做一些工作时显示进度条?,人们已经推荐使用BackgroundWorker。我认为在BackgroundWorkerDoWork 方法中您可以直接更新 GUI,但是为什么需要使用Invoke.

toolTip.SetToolTip(button, toolTipText);
4

3 回答 3

6

回调被RunWorkerCompleted编组到 UI 线程;DoWork不是。

您应该使用该ReportProgress方法在DoWork处理期间更新 UI。

请参阅:如何:在后台运行操作

于 2009-12-28T06:30:31.443 回答
3

你错了,你不能直接从 DoWork 方法的处理程序调用 UI 线程,因为这是在后台线程上。

如果要更新 UI,应调用 ReportProgress 方法,然后从 ProgressChanged 事件的事件处理程序更新 UI。

虽然您可以在后台线程中调用 Invoke 方法,但这样做违背了使用 BackgroundWorker 类的目的。ProgressChanged 事件在 UI 线程上引发,当后台线程发生更改时,您应该使用该机制来更新 UI 组件。

于 2009-12-28T06:30:27.340 回答
1

请记住,如果您从非 UI 线程调用 RunWorkerAsync(),您将需要从 ProgressChanged 和 RunWorkerCompleted 事件处理程序调用 Invoke。

于 2009-12-28T07:19:14.653 回答