5

Web サービスへの非同期呼び出しを行うメソッドがあります。そんな感じ:

public static async Task<ReturnResultClass> GetBasicResponseAsync()
{
    var r = await SomeClass.StartAsyncOp();
    return await OtherClass.ProcessAsync(r);
}

そして、同期の代替手段を提供したい:

public static ReturnResultClass GetBasicResponse()
{
    return GetBasicResponseAsync().Result;
}

しかし、それはResult呼び出し時にブロックします。非同期操作と同じスレッドで呼び出されるためです。どうすれば同期的に結果を取得できますか?

ありがとう!

4

1 に答える 1

10

GUI アプリケーションを使用している場合、メソッドの継続部分はasyncデフォルトで UI スレッドで実行されます。また、UI スレッドで同じ Task に対して同期待ちを同時に実行すると、デッドロックが発生します。

それがあなたのアプリケーションの場合は、タスクを同期的に待機しないことでこれを解決できます。

ライブラリを作成しているだけの場合は、 を使用してこれを修正できますConfigureAwait(false)。このように、メソッドの継続部分は、キャプチャされたコンテキスト (GUI アプリケーションの UI スレッド) ではなく、ThreadPool スレッドで実行されます。

public static async Task<ReturnResultClass> GetBasicResponseAsync()
{
    var r = await SomeClass.StartAsyncOp().ConfigureAwait(false);
    return await OtherClass.ProcessAsync(r).ConfigureAwait(false);
}

もちろん、理想的な解決策は、他のユーザーが必要に応じて同期バージョンのメソッドを使用できるように、GUI アプリで同期操作を使用せずConfigureAwait()ライブラリで使用することです。

于 2012-03-03T14:28:52.203 に答える