从异步回调更新UI组件

时间:2010-11-01 19:11:02

标签: silverlight dispatcher

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

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

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

有人可以解释为什么我没有看到这个例外,或者确认我的原始假设是否正确吗?

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

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

希望有所帮助。