【问题标题】:What thread calls the completed event handler on silverlight WCF calls?什么线程在 silverlight WCF 调用上调用已完成的事件处理程序?
【发布时间】:2011-06-07 10:51:19
【问题描述】:

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

void DoStuff()
{
    MyProxy proxy = new MyProxy();
    proxy.DoStuffCompleted += DoStuffCompleted;
    proxy.DoStuffAsync();
}

void DoStuffCompleted(object sender, DoStuffCompletedEventArgs e)
{
    // Handle the result.
}

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

【问题讨论】:

  • 添加了 C# 和 .NET 标记以提高可见性。

标签: c# .net multithreading silverlight wcf


【解决方案1】:

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

proxy.DoStuffAsync(object userState)

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

更新:

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

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

【讨论】:

  • 谢谢,这与我使用调试器发现的一致。你知道这是否在任何地方都有明确的记录吗?
【解决方案2】:

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

【讨论】:

  • 恕我直言,这对于 WPF(和 Silverlight)并不重要。因为Dispatcher UI 元素似乎总是从正确的线程调用。很抱歉我不能提供更详细的信息,也许这里有一些有用的东西:msdn.microsoft.com/en-us/library/ms741870.aspx
  • @Vladislav:我不确定您所说的“似乎总是从正确的线程中调用”是什么意思。这里没有魔法,如果你试图从一个线程other而不是UI线程来操作一个UI元素,你会得到一个异常。这就是为什么重要的是要知道你是否在 UI 线程上。通常在完成 WCF 后,您想要更新 UI,在通过 Dispatcher 切换到 UI 线程之前切换到 UI 线程很重要。
  • @AnthonyWJones:我做了一些快速测试并逐步完成了 reference.cs 代码,并在工作线程上调用了内部“管道”代码,但在主线程上触发了已完成的事件。您知道这是否可以信任,从而可以跳过调用 UI 组件中的同步吗?
  • 这个答案是错误的,不是吗?在 silverlight 中调用另一个线程上的 Web 服务的含义超出了问题的范围,因为 OP 声明他是从主线程调用的。
  • @Aardvark:你是对的,这个答案在实际问题的范围内是不正确的。我的错。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 2016-12-28
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    相关资源
    最近更新 更多