24

Webリクエストを行うときにAsyncとAwaitを使用しようとしていますが、awaitラインを超えることはありません。これはMetroアプリから実行していますが、winformsアプリでも問題を確認しました。

public async Task<string> DoSomething()
{
    string url = "http://imgur.com/gallery/VcBfl.json";
    HttpWebRequest request = HttpWebRequest.CreateHttp(url);

    var ws = await request.GetResponseAsync();

    return ws.ResponseUri.ToString(); ;
}

awaitを使用せず、代わりに同期待機を実行すると機能しますが、非同期で実行するにはこれが必要です。

このコードには何が欠けているので、awaitが二度と戻らないのですか?

4

1 に答える 1

38

コールスタックのさらに上にあると思われます。呼び出しているかWaitResult返されたTask. 私のブログで説明しているように、これはデッドロックを引き起こします。

デッドロックを回避するには、次のベスト プラクティスに従ってください。

  1. asyncコードをブロックしないでください。下まで使いasyncます。
  2. 「ライブラリ」メソッドでは、を使用しますConfigureAwait(false)
于 2012-10-03T04:31:15.243 に答える