假设我有一个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
方法?如果我同时调用两个异步调用,是否有可能在不同的线程上同时触发两个已完成的事件?
答案 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)