-1

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

4

2 回答 2

2

根据以下文件BackgroundWorker.ReportProgress

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

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

于 2013-06-01T15:22:30.607 回答
2

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

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

于 2013-06-01T15:22:50.953 回答