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

.net BackgroundWorker引发的事件未在预期线程上执行,.net,vb.net,multithreading,backgroundworker,.net,Vb.net,Multithreading,Backgroundworker,winforms对话框正在使用BackgroundWorker执行一些异步操作,取得了显著的成功。有时,后台工作程序运行的异步进程需要向winforms应用程序引发事件,以获得用户响应(一条询问用户是否希望取消的消息),其响应在事件的CancelEventArgs类型中捕获 作为线程的一个实现,我本来希望worker的RaiseEvent启动,然后worker将继续,因此要求我暂停worker,直到收到响应为止。但是,工作进程会等待raise事件执行的代码完成 看起来我通过事件调用调用的方法实际

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

作为线程的一个实现,我本来希望worker的RaiseEvent启动,然后worker将继续,因此要求我暂停worker,直到收到响应为止。但是,工作进程会等待raise事件执行的代码完成

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


有人能解释一下为什么这不是我所期望的吗

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


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

谢谢Josh,看起来不错,我明天会查看它。我仍然感到惊讶的是,当我从该事件调用Windows.Forms.Messagebox.Show时,没有引发跨线程异常,因为它仍然在后台线程中。没有“UI线程”这样的东西,只是碰巧有一个线程您只从中运行UI内容。任何线程都可以调用诸如MessageBox之类的UI,或者创建和显示WinForms。同样,您的工作线程并不真正知道它是异步运行的,因此会像正常运行一样引发事件。从技术上讲,Chris是正确的,但是调用MessageBox。从当前没有消息循环的线程显示将导致创建一个消息循环(否则MessageBox将无法工作)因此,我同意,如果检查Windows窗体控件的工作方式是否存在非法的跨线程访问,那就太好了。顺便说一句,当您从后台线程调用MessageBox时,您通常可以立即知道,因为它不会像其他控件那样进行视觉样式设置。按钮将是XP之前的“平面”样式。嗨,Josh,从上面的评论中我收集到了这个消息框。Show将永远不会抛出跨线程异常。如果这是正确的,那么以我当前的方式显示messagebox,您是否看到了任何不良的副作用。这将省去使用post方法和锁定后台线程的需要,直到通过CancelEventArgs从messagebox返回响应为止。当然,如果需要比messagebox更丰富的UI,那么我们需要做所有这些。