108

asyncインスタンスを返すメソッドを呼び出している状況がありIDisposableます。例えば:

HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com"));

以前asyncは、IDisposableインスタンスを操作するときに、"response" 変数を使用したこの呼び出しとコードが using ステートメントでラップされていました。

async私の質問は、キーワードがミックスにスローされた場合でも、それが正しいアプローチであるかどうかです。コードはコンパイルされますが、以下の両方の例で using ステートメントは期待どおりに機能しますか?

例 1

using(HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com")))
{
    // Do something with the response

    return true;
}

例 2

using(HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com")))
{
    await this.responseLogger.LogResponseAsync(response);

    return true;
}
4

1 に答える 1

104

はい、それでいいはずです。

最初のケースでは、あなたは本当に言っています:

  • 応答が得られるまで非同期で待機する
  • 使ってすぐ捨てる

2 番目のケースでは、次のように言っています。

  • 応答が得られるまで非同期で待機する
  • 応答をログに記録するまで非同期に待機します
  • 応答を破棄する

非同期メソッドのusingステートメントは、(同期コンテキストなどに応じて) リソースを取得したスレッドとは異なるスレッドで呼び出しが実行される可能性があるという点で「奇妙」ですが、Disposeそれでも発生します...あなたが待っていることを想定してもちろん、これまでに現れたり失敗したりします。(ステートメントに返されないメソッドへの呼び出しが含まれているDispose場合、非非同期コードで呼び出してしまうことはないのと同じように。)using

于 2013-05-15T13:38:44.180 に答える