即使正在进行的控件更改事件,跨线程操作也无效

时间:2013-06-01 15:12:34

标签: vb.net multithreading visual-studio-2010

我正在调用backgroundworker来完成任务并通过ProgressChanged事件更改控件,它工作正常,直到我从另一个后台工作者调用backgroundwoker。现在我得到了这个Crossthread Operation异常。

2 个答案:

答案 0 :(得分:2)

根据BackgroundWorker.ReportProgress的文件:

  

对ReportProgress方法的调用是异步的,并立即返回。 ProgressChanged事件处理程序在创建BackgroundWorker的线程上执行。

因此,如果要直接更新ProgressChanged事件处理程序中的控件,则必须在UI线程上创建BackgroundWorkers。

答案 1 :(得分:2)

当您调用RunWorkerAsync时,BackgroundWorker会捕获此时的同步上下文,并且随后会在ProgressChanged事件触发时使用该同步上下文。如果碰巧在UI线程以外的线程上调用RunWorkerAsync(当您在另一个工作线程的DoWork处理程序中调用它时会发生这种情况),则ProgressChanged事件将在非UI线程上触发。如果在这种情况下事件处理程序尝试访问UI,则会出现您描述的异常。

您需要将第二次调用RunWorkerAsync移动到第一个worker的ProgressChanged / RunWorkerCompleted事件的处理程序中,或者找到另一种临时切换到UI线程的方法,即使用Control.Invoke或类似的方法。