ホームページ > バックエンド開発 > C++ > 「await Task.WhenAll」と複数の Await: 複数の非同期タスクを処理するための推奨方法はどれですか?

「await Task.WhenAll」と複数の Await: 複数の非同期タスクを処理するための推奨方法はどれですか?

Linda Hamilton
リリース: 2025-01-20 07:26:09
オリジナル
494 人が閲覧しました

`await Task.WhenAll` vs. Multiple Awaits: Which is the Preferred Method for Handling Multiple Asynchronous Tasks?

非同期タスクの完了に推奨される方法: 単一の await Task.WhenAll と複数の await

の比較

非同期プログラミングでは、複数のタスクを処理するときに、開発者は多くの場合、単一の await Task.WhenAll ステートメントを使用するか、複数の await ステートメントを順番に実行するかを選択する必要があります。この記事では、特にタスクが完了する順序が重要ではないシナリオにおいて、複数の await Task.WhenAll ではなく await を使用する利点について説明します。

次のコード スニペットは両方のメソッドを示しています。

<code class="language-csharp">// 使用多个 await
static async Task DoWork1()
{
    var t1 = DoTaskAsync("t1.1", 3000);
    var t2 = DoTaskAsync("t1.2", 2000);
    var t3 = DoTaskAsync("t1.3", 1000);

    await t1; await t2; await t3;

    Console.WriteLine("DoWork1 results: {0}", String.Join(", ", t1.Result, t2.Result, t3.Result));
}

// 使用 await Task.WhenAll
static async Task DoWork2()
{
    var t1 = DoTaskAsync("t2.1", 3000);
    var t2 = DoTaskAsync("t2.2", 2000);
    var t3 = DoTaskAsync("t2.3", 1000);

    await Task.WhenAll(t1, t2, t3);

    Console.WriteLine("DoWork2 results: {0}", String.Join(", ", t1.Result, t2.Result, t3.Result));
}</code>
ログイン後にコピー

複数の await Task.WhenAll よりも await の方が優れているのはなぜですか?

  1. エラーの伝播: await Task.WhenAll は、さまざまなタスクからすべてのエラーを収集し、それらを AggregateException として伝播します。これにより、1 つ以上のタスクが失敗した場合でも、エラーが失われないことが保証されます。複数の await は、前の await が例外をスローしたときにエラーを非表示にします。

  2. 完了保証: await Task.WhenAll 一部のタスクにエラーがあるかキャンセルされた場合でも、すべてのタスクが返される前に完了することを保証します。これは、コードが利用可能なすべてのタスクの結果に依存している場合に特に便利です。

  3. コードを簡素化します: await Task.WhenAll を使用すると、コード内で複数のタスクを待機するセマンティクスが明示的になり、可読性が向上し、同時実行関連のバグのリスクが軽減されます。

以上が「await Task.WhenAll」と複数の Await: 複数の非同期タスクを処理するための推奨方法はどれですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート