假设我们的服务TestService
采用DoWork
方法。在客户端,它将生成DoWorkCompleted
和DoWorkAsync
方法。
如果你从UI线程调用DoWorkAsync
,这是我的观察,DoWorkCompleted
将按预期在UI线程上执行。
但是,如果我从BackgroundWorker
开始并从中调用服务DoWorkAsync
,那么DoWorkCompleted
将在除调用者线程之外的新线程上执行。例如:
BackgroundWorker
实例< -
来自UI线程DoWork
方法被执行
< - Thread 2 DoWorkAsync
worker DoWork
< - 来自主题2 DoWorkCompleted
被执行< - Thread 3 DoWorkCompleted
得到
执行< - UI线程服务客户端如何知道何时启动新线程以及何时将其发回给调用者线程?
答案 0 :(得分:3)
这与线程上SynchronizationContext
的可用性有关。在Windows窗体中,我假设Silverlight是相同的,当你启动一个应用程序时,将成为UI线程的主线程提供了一个SynchronizationContext
,允许将调用封送回UI线程。
在您的第一个场景中,由于您从具有可用同步上下文的线程调用DoWorkAsync
,DoWorkCompleted
将被编组回初始线程。
在第二个场景中,您处于没有同步上下文的线程池线程中,因此DoWorkCompleted
不会被编组回初始线程。