2012-04-28 38 views
0

我有一個WCF服務中的異步方法和使用此方法的客戶端。當我調用該方法時,客戶端的GUI將被阻止,直到異步方法結束。我的代碼如下:WCF異步模式開始/結束任務阻止客戶端的GUI

SERVICE

public IAsyncResult BeginAsyncMethod(CustomClass paramCustomClass, AsyncCallback callback, object state) 
     {    
      Task<bool> task = Task<bool>.Factory.StartNew(p => slowMethod(paramCustomClass, state); 
      return task.ContinueWith(res => callback(task)); 
     } 


public bool EndAsyncMethod(IAsyncResult paramResult) 
     { 
      return ((Task<bool>)paramResult).Result; 
     } 

slowMethod是虛擬方法與用於從i = 0到1000000000.

CLIENT

private void callAsyncMethod() 
{ 
     Task<bool> task = Task<bool>.Factory.FromAsync(_proxy.Proxy.BeginAsyncMethod, _proxy.Proxy.EndAsyncMethod, CustomClass, null);  
     bool hasFinished= task.Result; 
} 

在客戶端,我有一個調用callAsyncMethod的按鈕,當我單擊該按鈕時,GUI在slowMethod運行時會變爲焦點。

如果我沒有錯,異步方法將控制權返回給調用者,以避免程序被阻塞,但在我的情況下,這不會發生。我誤解了一些東西嗎?我以錯誤的方式使用異步方法?

謝謝。 Daimroc。

回答

2

即使這些方法是異步的,您仍在等待結果返回,從而有效地阻止調用線程(UI)。當您訪問Task對象的Result屬性時,如果任務尚未完成,它將阻塞,直到結果可用。

您應該異步調用異步方法。如果您使用.NET 4.5,您可以使用關鍵字等待:

private async void callAsyncMethod() 
{ 
    Task<bool> task = Task<bool>.Factory.FromAsync(_proxy.Proxy.BeginAsyncMethod, _proxy.Proxy.EndAsyncMethod, CustomClass, null);  
    bool hasFinished = await task; 
} 

否則,你就真的需要撥打電話異步

private void callAsyncMethod() { 
    _proxy.Proxy.BeginAsyncMethod(CustomClass, null, MyCallback, _proxy); 
} 

private void MyCallback(IAsyncResult asyncResult) { 
    bool hasFinished = _proxy.Proxy.EndAsyncMethod(asyncResult); 
} 
+2

如何能做到這一點,而不.NET 4.5?我的意思是,在.NET 4.0和任務中,因爲我看到在這種情況下,我需要開始/結束方法,大大提高.NET 4.5的優勢,它似乎很小。謝謝。 – 2012-05-10 11:03:53