在最后一个问题中,在 C# 中做一些工作时显示进度条?,人们已经推荐使用BackgroundWorker
。我认为在BackgroundWorker
DoWork 方法中您可以直接更新 GUI,但是为什么需要使用Invoke
.
toolTip.SetToolTip(button, toolTipText);
在最后一个问题中,在 C# 中做一些工作时显示进度条?,人们已经推荐使用BackgroundWorker
。我认为在BackgroundWorker
DoWork 方法中您可以直接更新 GUI,但是为什么需要使用Invoke
.
toolTip.SetToolTip(button, toolTipText);
你错了,你不能直接从 DoWork 方法的处理程序调用 UI 线程,因为这是在后台线程上。
如果要更新 UI,应调用 ReportProgress 方法,然后从 ProgressChanged 事件的事件处理程序更新 UI。
虽然您可以在后台线程中调用 Invoke 方法,但这样做违背了使用 BackgroundWorker 类的目的。ProgressChanged 事件在 UI 线程上引发,当后台线程发生更改时,您应该使用该机制来更新 UI 组件。
请记住,如果您从非 UI 线程调用 RunWorkerAsync(),您将需要从 ProgressChanged 和 RunWorkerCompleted 事件处理程序调用 Invoke。