BackgroundWorker引发的事件未在预期的线程上执行

时间:2010-03-22 06:31:39

标签: .net vb.net multithreading backgroundworker

winforms对话框正在使用BackgroundWorker执行一些非常成功的异步操作。有时,后台工作程序运行的异步进程需要将事件引发到winforms应用程序以进行用户响应(询问用户是否要取消的消息),其响应在事件的CancelEventArgs类型中捕获。

作为线程的实现,我本来期望工作者的RaiseEvent被激活,然后工作者会继续,因此要求我暂停工作直到收到响应。但是,工作人员会等待raise事件执行的代码完成。

似乎我通过事件调用调用的方法实际上是后台工作者使用的工作线程,我很惊讶,因为我希望在主线程运行的主线程上看到它。同样令人惊讶的是,没有抛出跨线程异常。

有人可以解释为什么这不符合我的预期吗?

1 个答案:

答案 0 :(得分:2)

BackgroundWorker将在UI线程上引发其ProgressChanged事件和RunWorkerCompleted事件(更准确地说,它将使用当前建立的SynchronizationContext将它们发布到线程。)

但它不会简单地让你在UI线程上引发任意事件。为此,您应该访问SynchronizationContext.Current并使用Post方法。