【问题标题】:Updating UI components from an async callback从异步回调更新 UI 组件
【发布时间】:2010-11-02 15:09:44
【问题描述】:

现在我了解了 Dispatcher 和 DispatcherTimer 以及它们的好处。 但我一直认为异步 Web 服务/WCF 回调(完成的事件处理程序)是由 UI 线程自动处理的。

但是查看一些在线参考资料,例如下面链接的参考资料,情况似乎并非如此。

所以奇怪的是,我没有使用 Dispatcher 在服务完成事件中更新 UI(更新数据绑定的 ObservableCollections),但我从未收到过跨线程异常。

谁能解释为什么我没有看到这个异常,或者确认我最初的假设是否正确?

参考: http://www.silverlightshow.net/items/Tip-Asynchronous-Silverlight-Execute-on-the-UI-thread.aspx

【问题讨论】:

  • 我从这个链接获得了更多信息:stackoverflow.com/questions/2521309/…
  • 我猜我从未见过跨线程异常,因为我正在更新一个集合(即使它是数据绑定到 UI)。

标签: silverlight dispatcher


【解决方案1】:

调度程序所做的是将消息放入正常的 Windows 消息队列中。如果更新绑定到 UI 元素的元素,则不需要使用调度程序,因为更新模型时引发的 PropertyChanged 已经将消息放入 Windows 消息队列,因此您不需要调用任何调度程序,否则您只需在窗口消息队列中进行两次往返。

【讨论】:

    【解决方案2】:

    最简单的解释是,这取决于您检索数据的方式以及您是否尝试更新 UI。例如,当直接使用 HttpWebRequest 时,它总是需要被封送回 UI 线程。但是,如果您使用的是 WebClient,那么这就是为您完成的。 WCF 也会为你做一些封送处理。

    “Silverlight 应用程序中的 WCF 代理使用发起 Web 服务调用的线程的 SynchronizationContext 在收到响应时调度异步事件处理程序的调用。”

    http://tomasz.janczuk.org/2009/08/improving-performance-of-concurrent-wcf.html

    换句话说,WCF 会将调用封送回调用它的线程。因此,如果您从 UI 线程调用服务调用,那么它们将返回 UI 线程。如果您在不同的线程上调用您的服务,那么您需要自己进行编组。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      相关资源
      最近更新 更多