在最后一个问题Display progress bar while doing some work in C#?中,人们推荐使用BackgroundWorker
。我想在BackgroundWorker
DoWork方法中可以直接更新GUI,但为什么这个函数调用需要使用Invoke
来调用。BackgroundWorker仍然需要调用Invoke?
toolTip.SetToolTip(button, toolTipText);
在最后一个问题Display progress bar while doing some work in C#?中,人们推荐使用BackgroundWorker
。我想在BackgroundWorker
DoWork方法中可以直接更新GUI,但为什么这个函数调用需要使用Invoke
来调用。BackgroundWorker仍然需要调用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事件处理函数调用来调用。