我有一個非常簡單的場景:
我的Silverlight應用程序中有一個異步WCF服務調用。
我想執行那些在一個單獨的線程(或類似的),因爲他們凍結了我的用戶界面。
所有的服務調用都是爲了更新ViewModel,從而更新頁面上的一個UI控件,所以需要從運行服務調用的線程中找到一種方法,而不會遇到熟悉的跨線程異常。
有什麼建議嗎?使用非UI線程從silverlight客戶端調用WCF服務
非常感謝。
我有一個非常簡單的場景:
我的Silverlight應用程序中有一個異步WCF服務調用。
我想執行那些在一個單獨的線程(或類似的),因爲他們凍結了我的用戶界面。
所有的服務調用都是爲了更新ViewModel,從而更新頁面上的一個UI控件,所以需要從運行服務調用的線程中找到一種方法,而不會遇到熟悉的跨線程異常。
有什麼建議嗎?使用非UI線程從silverlight客戶端調用WCF服務
非常感謝。
Dispatcher.BeginInvoke是最好的解決方案。
服務代理的部分認定中:從MVVM
public void GetItemById(int id, Action<ItemModel> callback)
{
AsyncCallback onCompleted = ar =>
Deployment.Current.Dispatcher.BeginInvoke(() =>
callback(this.Channel.EndGetItemById(ar)));
this.Channel.BeginGetItemById(id, onCompleted, null);
}
電話:
var proxy = new MyServiceProxy();
proxy.GetItemById(5, item => this.Item = item);
您可以使用BackgroundWorker或使您的客戶端代理支持Asynchronous Pattern。
確保你發送這裏描述UI更新到正確的線程: http://russelleast.wordpress.com/2010/02/27/using-wcf-async-pattern-with-silverlight-3/
與在WCF團隊鄉親講,這是我它是如何工作的理解。如果您只是簡單地從後臺線程進行調用,那麼它將不起作用,因爲WCF子系統會將調用回傳到您最初打開連接的線程(通常是UI線程)。所以你必須做的是創建一個工作者線程,然後明確地從該線程打開連接。然後,每當你打電話時,它都會被封送回該線程。當然,一旦你已經收到你的回調並完成你的處理(在後臺線程上),那麼請確保你使用Dispatcher.BeginInvoke()將任何UI變更編組回UI界面。
你只要讓我很快樂。我有一種情況,我想等待一個由WCF調用完成的處理程序設置的句柄上的UI線程。那麼,這個通話完成永遠不會發生,因爲通話本身甚至不能開始,直到等待之後! – Kit 2011-08-29 23:04:32