什么线程在silverlight WCF调用上调用已完成的事件处理程序?

假设我有Silverlight应用程序调用WCF服务:

void DoStuff() { MyProxy proxy = new MyProxy(); proxy.DoStuffCompleted += DoStuffCompleted; proxy.DoStuffAsync(); } void DoStuffCompleted(object sender, DoStuffCompletedEventArgs e) { // Handle the result. } 

UI线程调用DoStuff 。 什么线程最终会调用DoStuffCompleted方法? 如果我同时调用两个异步调用,是否有可能在不同的线程上同时触发两个已完成的事件?

将在主线程上调用回调。 多个响应不会同时发生。 响应事件的顺序可能是意外的。 您可能希望使用接受“用户状态”对象的proxy.DoStuffAsync的重载:

proxy.DoStuffAsync(object userState)

这将允许您为每个调用发送一些独特的内容,以便区分您正在处理的响应。 请记住,如果WCF调用返回错误,则没有返回值 – 因此userState可能是了解哪个调用失败(如果重要)的唯一方法。

更新:

找到关于如何使用另一个线程的更多信息(在SO上):

Silverlight Web服务回调性能按照链接到Tomek的博客获取更多信息。

Completed事件将发生在与UI线程不同的线程上。 可以在不同线程上同时执行多个已完成事件,因为线程池用于处理结果。

Asynch调用在后台线程池中执行。 对于每个异步调用,您应该从池中有一个单独的线程。

DoStuffCompleted将在后台池线程中执行。

现在,重要的是要注意在后台工作线程上调用此方法。 如果我们想用新获得的数据更新UI(假设我们想要更新数据网格控件以显示客户数据),我们必须小心在UI线程上执行此操作。 如果我们不这样做,那么可能会发生各种奇怪的事情,我们将很难确定要修复的错误( 从这里开始 )