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

时间:2011-06-07 10:51:20

标签: c# .net multithreading 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方法?如果我同时调用两个异步调用,是否有可能在不同的线程上同时触发两个已完成的事件?

3 个答案:

答案 0 :(得分:3)

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

proxy.DoStuffAsync(object userState)

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

更新

发现了一些关于如何使用另一个线程的更多信息(在SO上):

Silverlight web service callback performance请点击 Tomek 的博客链接获取更多信息。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

  

现在,重要的是要注意这一点   方法在后台调用   工人线程。如果我们想要更新   具有新获得的数据的UI   (说我们想要更新数据网格   控制以显示客户数据),   我们必须小心这样做   UI线程。如果我们不这样做,那么所有   可能会发生奇怪的事情   我们将度过一段艰难时期   诊断要修复的错误(from here