2010-11-03 118 views
1

我有一個非常簡單的場景:
我的Silverlight應用程序中有一個異步WCF服務調用。
我想執行那些在一個單獨的線程(或類似的),因爲他們凍結了我的用戶界面。
所有的服務調用都是爲了更新ViewModel,從而更新頁面上的一個UI控件,所以需要從運行服務調用的線程中找到一種方法,而不會遇到熟悉的跨線程異常。
有什麼建議嗎?使用非UI線程從silverlight客戶端調用WCF服務

非常感謝。

回答

0

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); 
3

與在WCF團隊鄉親講,這是我它是如何工作的理解。如果您只是簡單地從後臺線程進行調用,那麼它將不起作用,因爲WCF子系統會將調用回傳到您最初打開連接的線程(通常是UI線程)。所以你必須做的是創建一個工作者線程,然後明確地從該線程打開連接。然後,每當你打電話時,它都會被封送回該線程。當然,一旦你已經收到你的回調並完成你的處理(在後臺線程上),那麼請確保你使用Dispatcher.BeginInvoke()將任何UI變更編組回UI界面。

+0

你只要讓我很快樂。我有一種情況,我想等待一個由WCF調用完成的處理程序設置的句柄上的UI線程。那麼,這個通話完成永遠不會發生,因爲通話本身甚至不能開始,直到等待之後! – Kit 2011-08-29 23:04:32