await Task.WhenAll
ではなく await
を選択するのでしょうか? 非同期タスクを扱う場合、複数の await Task.WhenAll
ステートメントの代わりに await
を使用する必要があるかどうかがよく質問されます。この記事では、特定のシナリオで Task.WhenAll
を使用する利点について説明します。
一連の非同期タスクを実行する次のメソッド (DoWork1
および DoWork2
) を考えてみましょう。
<code class="language-csharp">static async Task DoWork1() { await DoTaskAsync("t1.1", 3000); await DoTaskAsync("t1.2", 2000); await DoTaskAsync("t1.3", 1000); } 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); }</code>
1. エラー処理:
には、すべてのタスクのエラーを一度に伝播できるという利点があります。 Task.WhenAll
では、タスクが失敗すると、これらのエラーは後続の DoWork1
ステートメントによって上書きされるため、失われます。一方、await
は、タスクの実行中に発生するすべてのエラーを収集して表示します。 DoWork2
2. タスク完了セマンティクス:
一部のタスクが失敗したりキャンセルされた場合でも、すべてのタスクが完了するまで待ちます。これは、タスクが例外またはタイムアウトをスローする可能性がある状況で明らかです。 Task.WhenAll
では、1 つのタスクが失敗またはタイムアウトした場合、プログラムは他のタスクを待たずに実行を継続します。これにより、予期しない動作や競合状態が発生する可能性があります。 DoWork1
3. コードの可読性:
を使用すると、すべてのタスクが完了するまで待機するという意図が明確に示されるため、コードの可読性が向上します。コードの非同期待機の側面をカプセル化し、実行の全体的なフローを理解しやすくします。 Task.WhenAll
以上が複数の `await` ステートメントの代わりに `await Task.WhenAll` を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。