2012-04-28 11 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; 
} 

のためにIダミー方法であり、 callAsyncMethodを呼び出すボタンがあります。ボタンをクリックすると、slowMethodの実行中にGUIがブロッキングされます。

私が間違っていない場合、非同期メソッドはプログラムがブロックされないようにコントロールを呼び出し側に返しますが、私の場合はこれは発生しません。私は何かを誤解していますか?私は間違った方法で非同期メソッドを使用していますか?

ありがとうございました。 ダイムロク。

答えて

2

メソッドが非同期であっても、結果が返るのを待っているため、呼び出しスレッド(UI)が効果的にブロックされます。 TaskオブジェクトのResultプロパティにアクセスすると、タスクが完了していない場合、結果が利用可能になるまでブロックされます。

非同期メソッドを非同期に呼び出す必要があります。あなたは.NET 4.5を使用している場合は、のawaitキーワードを使用することができます。

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

そうでない場合は、あなたが本当にコール非同期.NET 4.5せずにそれを行うことができますどのように

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

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

を作成する必要がありますか?つまり、.NET 4.0とタスクでは、この場合、Begin/Endメソッドが必要であることがわかります.SOF 4.5の利点は小さいと思われます。ありがとう。 –

関連する問題