ステートメントを使用し、キーワードがC#で適切に再生されるのを待つ


101

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

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

さて、以前asyncはシーンでしたが、IDisposableインスタンスを操作する場合、「応答」変数を使用したこの呼び出しとコードは、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;
}

回答:


97

はい、問題ありません。

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

  • 応答が得られるまで非同期的に待機します
  • 使用してすぐに廃棄してください

2番目のケースでは、あなたは言っています:

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

using非同期メソッド内のステートメントは、その中で「奇数」であるDisposeコールは、リソースを取得した1(同期コンテキストなどに依存する)に別のスレッドで実行することもできるが、それはまだ事のためにあなたのしている待機を想定し...どうなりますこれまでに現れたり、もちろん、失敗します。(ステートメントに戻り値のないメソッドへの呼び出しが含まれているDispose場合に、非同期コードで呼び出されなくなるのと同じですusing。)


4
ジョン、ありがとう。非同期のもののほとんどはまだブードゥー教ですが、他の.net機能と統合して機能する頻度を確認するのは非常に安心です
swingdoctor

@JonSkeet using(){...}ブロック内で使用するのを待つ必要がありますか、それとも過剰であるか、場合によってはパフォーマンスが低下する可能性がありますか?んusing(){...}と同じ目的を果たしますかawait
ナム

1
@nam:いいえ、まったく異なる目的usingawait果たします。C#8にも非同期の処理が追加されていることに注意してください。それの価値が私の答えのハイライトスレッドの問題を認識しながら、それは間違いなく、それはだという意味ではありません間違って混合するusingawait
Jon Skeet
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.