BackgroundWorker还需要调用Invoke吗?
在C#中做一些工作的最后一个问题显示进度条? ,人们建议使用BackgroundWorker
。 我认为在BackgroundWorker
DoWork方法中你可以直接更新GUI,但是为什么需要使用Invoke
来Invoke
这个函数Invoke
。
toolTip.SetToolTip(button, toolTipText);
RunWorkerCompleted
回调被编组到UI线程上; DoWork
不是。
您应该使用ReportProgress
方法在DoWork
处理期间更新UI。
请参阅: 如何:在后台运行操作
你错了,你不能直接从DoWork方法的处理程序调用UI线程,因为这是在后台线程上。
如果要更新UI,则应调用ReportProgress方法,然后从ProgressChanged事件的事件处理程序更新UI。
虽然您可以在后台线程中调用Invoke方法,但这样做会破坏使用BackgroundWorker类的目的。 ProgressChanged事件在UI线程上抛出,是在后台线程上发生更改时应该用来更新UI组件的机制。
请记住,如果从非UI线程调用RunWorkerAsync(),则需要从ProgressChanged和RunWorkerCompleted事件处理程序调用Invoke。