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
の方が優れているのはなぜですか?
エラーの伝播: await Task.WhenAll
は、さまざまなタスクからすべてのエラーを収集し、それらを AggregateException
として伝播します。これにより、1 つ以上のタスクが失敗した場合でも、エラーが失われないことが保証されます。複数の await
は、前の await
が例外をスローしたときにエラーを非表示にします。
完了保証: await Task.WhenAll
一部のタスクにエラーがあるかキャンセルされた場合でも、すべてのタスクが返される前に完了することを保証します。これは、コードが利用可能なすべてのタスクの結果に依存している場合に特に便利です。
コードを簡素化します: await Task.WhenAll
を使用すると、コード内で複数のタスクを待機するセマンティクスが明示的になり、可読性が向上し、同時実行関連のバグのリスクが軽減されます。
以上が「await Task.WhenAll」と複数の Await: 複数の非同期タスクを処理するための推奨方法はどれですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。