哪个线程在silverlight WCF调用上调用已完成的事件处理程序

本文关键字:调用 已完成 事件处理 程序 WCF 线程 silverlight | 更新日期: 2023-09-27 17:58:38

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

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

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

哪个线程在silverlight WCF调用上调用已完成的事件处理程序

回调将在主线程上调用。多个响应不会同时发生。响应事件的顺序可能出乎意料。您可能需要使用代理的过载。接受"用户状态"对象的DoStuffAsync:

proxy.DoStuffAsync(object userState)

这将允许你为每个电话发送一些独特的信息,这样你就可以区分你正在处理的响应。请记住,如果WCF调用返回错误,则没有返回值,因此userState可能是知道哪个调用失败的唯一方法(如果重要的话)。

更新:

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

Silverlight web服务回调性能请访问Tomek博客中的链接以获取更多信息。

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

异步调用在后台线程池中执行。对于每个异步调用,您将从池中获得一个单独的线程。

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

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