异步调用如何知道何时在新线程中启动已完成的事件或使用调用者线程

时间:2011-03-16 09:32:55

标签: c# silverlight asynchronous

假设我们的服务TestService采用DoWork方法。在客户端,它将生成DoWorkCompletedDoWorkAsync方法。

如果你从UI线程调用DoWorkAsync,这是我的观察,DoWorkCompleted将按预期在UI线程上执行。

但是,如果我从BackgroundWorker开始并从中调用服务DoWorkAsync,那么DoWorkCompleted将在除调用者线程之外的新线程上执行。例如:

  1. 启动BackgroundWorker实例< - 来自UI线程
  2. 工作人员DoWork方法被执行 < - Thread 2
  3. 从中呼叫服务DoWorkAsync worker DoWork< - 来自主题2
  4. 服务运行和DoWorkCompleted 被执行< - Thread 3
  5. 工作人员DoWorkCompleted得到 执行< - UI线程
  6. 服务客户端如何知道何时启动新线程以及何时将其发回给调用者线程?

1 个答案:

答案 0 :(得分:3)

这与线程上SynchronizationContext的可用性有关。在Windows窗体中,我假设Silverlight是相同的,当你启动一个应用程序时,将成为UI线程的主线程提供了一个SynchronizationContext,允许将调用封送回UI线程。

在您的第一个场景中,由于您从具有可用同步上下文的线程调用DoWorkAsyncDoWorkCompleted将被编组回初始线程。

在第二个场景中,您处于没有同步上下文的线程池线程中,因此DoWorkCompleted不会被编组回初始线程。