Silverlight 从异步回调更新UI组件

Silverlight 从异步回调更新UI组件,silverlight,dispatcher,Silverlight,Dispatcher,现在我了解了调度员和调度员及其优点。 但我一直认为异步web服务/WCF回调(完成的事件处理程序)是由UI线程自动处理的 但看看网上的一些参考资料,比如下面的链接,情况似乎并非如此 所以奇怪的是,我没有使用Dispatcher在服务完成事件中更新UI(更新数据绑定的ObservableCollections),但我从未收到跨线程异常 有人能解释为什么我没有看到这个异常,或者确认我最初的假设是否正确吗 参考: 调度程序所做的是将消息放入正常的windows消息队列中。如果更新绑定到UI元素的元素,

现在我了解了调度员和调度员及其优点。 但我一直认为异步web服务/WCF回调(完成的事件处理程序)是由UI线程自动处理的

但看看网上的一些参考资料,比如下面的链接,情况似乎并非如此

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

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

参考:

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

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

最简单的解释是,这取决于您如何检索数据以及是否尝试更新UI。例如,当直接使用HttpWebRequest时,总是需要将其封送回UI线程。但是,如果您使用的是WebClient,那么您就可以这样做了。WCF还将为您执行一些封送处理

“Silverlight应用程序中的WCF代理使用启动web服务调用的线程的SynchronizationContext来计划接收响应时异步事件处理程序的调用。”

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


希望这会有所帮助。

最简单的解释是,这取决于您如何检索数据以及是否尝试更新UI。例如,当直接使用HttpWebRequest时,总是需要将其封送回UI线程。但是,如果您使用的是WebClient,那么您就可以这样做了。WCF还将为您执行一些封送处理

“Silverlight应用程序中的WCF代理使用启动web服务调用的线程的SynchronizationContext来计划接收响应时异步事件处理程序的调用。”

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


希望能有所帮助。

我从这个链接获得了更多信息:我猜我从来没有看到过跨线程异常,因为我正在更新一个集合(即使它是绑定到UI的数据)。我从这个链接获得了更多信息:我猜我从来没有看到过跨线程异常,因为我正在更新一个集合(即使它是绑定到UI的数据)。