BackgroundWorker还需要调用Invoke吗?

时间:2009-12-28 06:24:40

标签: c# backgroundworker invoke

在上一个问题Display progress bar while doing some work in C#?中,人们建议使用BackgroundWorker。我想在BackgroundWorker DoWork方法中你可以直接更新GUI,但是为什么需要使用Invoke来调用这个函数调用。

toolTip.SetToolTip(button, toolTipText);

3 个答案:

答案 0 :(得分:6)

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

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

请参阅:How to: Run an Operation in the Background

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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