2010-11-01 68 views
2

現在我瞭解了Dispatcher和DispatcherTimer及其好處。 但我一直覺得異步web服務/ WCF回調(完成的事件處理程序)是由UI線程自動處理的。從異步回調中更新UI組件

但在網上查看一些參考文獻,例如下面鏈接的參考文獻,似乎並非如此。

所以奇怪的是,我沒有使用Dispatcher更新服務完成事件中的UI(更新數據綁定的ObservableCollections),但我從未收到過跨線程異常。

任何人都可以解釋爲什麼我沒有看到這個例外,或確認我原來的假設是否正確?

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

+0

我從這個鏈接得到了更多的信息:http://stackoverflow.com/questions/2521309/asynchronous-silverlight-wcf-callback – AlvinfromDiaspar 2010-11-01 19:34:09

+0

而我猜我從來沒有看到跨線程異常,因爲我正在更新一個集合(即使它是數據綁定到UI)。 – AlvinfromDiaspar 2010-11-01 19:34:51

回答

0

調度員做的是把什麼消息,進入正常的Windows消息queuse。如果更新綁定到UI元素的元素,則不需要使用調度程序,因爲更新模型時引發的PropertyChanged已將消息放入Windows消息隊列中,因此不需要調用任何調度程序,否則你只需要在窗口消息隊列中進行兩次往返。

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線程。如果您在其他線程上調用您的服務,那麼您將需要自己進行編組。

希望有所幫助。