web-dev-qa-db-ja.com

HttpWebRequest.GetResponseAsyncを使用した非同期と待機

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が戻らない原因は何ですか?

21
John Koerner

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

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

  1. asyncコードでブロックしないでください。 asyncを最後まで使用してください。
  2. 「ライブラリ」メソッドで、ConfigureAwait(false)を使用します。
34
Stephen Cleary