0

WCF サービスに非同期メソッドがあり、このメソッドを使用するクライアントがあります。メソッドを呼び出すと、非同期メソッドが終了するまでクライアントの GUI がブロックされます。私のコードは次のとおりです。

サービス

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 までの for を持つダミー メソッドです。

クライアント

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

クライアントには、callAsyncMethod を呼び出すボタンがあり、ボタンをクリックすると、slowMethod の実行中に GUI がブロックされます。

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

ありがとう。ダイムロック。

4

1 に答える 1

2

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

非同期メソッドを非同期で呼び出す必要があります。.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;
}

それ以外の場合は、実際に呼び出しを非同期にする必要があります

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

private void MyCallback(IAsyncResult asyncResult) {
    bool hasFinished = _proxy.Proxy.EndAsyncMethod(asyncResult);
}
于 2012-04-29T00:20:49.530 に答える