.NET 非同期プログラミング: Task.Start/Wait と Async/Await の詳細な説明
.NET Framework は、Task.Start/Wait と Async/Await という 2 つの非同期プログラミング メカニズムを提供します。この 2 つは類似点がありますが、動作と影響には大きな違いがあります。
タスク.開始/待機
Task.Start/Wait メソッドでは、タスクを手動で開始し、Wait() メソッドを使用してタスクの完了を明示的に待機する必要があります。これは同期プログラミングでは一般的なパターンであり、主に短期間の非ブロッキング操作に適しています。 Task.Start/Wait を使用するコードは次のようになります:
<code class="language-csharp">public void MyMethod() { Task t = Task.Factory.StartNew(DoSomethingThatTakesTime); t.Wait(); UpdateLabelToSayItsComplete(); }</code>
Task.StartNew() を呼び出して、新しいバックグラウンド タスクを作成して開始します。 Wait() メソッドは、タスクが完了するまで現在のスレッドをブロックし、後続のコード (ラベルの更新など) がタスクの完了後にのみ実行されるようにします。
非同期/待機
Async/Await (.NET 4.5 で導入) は、現在のスレッドをブロックせずに非同期操作を処理する、より自然で効率的な方法を提供します。このアプローチは、共同マルチタスクと継続の概念を活用します。 Async/Await を使用するコードは次のようになります:
<code class="language-csharp">public async void MyMethod() { var result = Task.Factory.StartNew(DoSomethingThatTakesTime); await result; UpdateLabelToSayItsComplete(); }</code>
async キーワードは、メソッドを非同期メソッドとして扱うようにコンパイラーに指示します。 await キーワードが出現すると、現在のメソッドが一時停止され、スレッド プールのスレッド上で非同期操作が続行され、制御が呼び出し元に返されます。待機中のタスクが完了すると、await に関連付けられた継続によって元のメソッドに実行が戻ります。
主な違い
Task.Start/Wait と Async/Await の主な違いは、スレッドの処理方法です。 Task.Start/Wait は、現在のスレッドとは独立して実行されるバックグラウンド タスクを作成して開始します。多数のバックグラウンド タスクが同時に作成されると、スレッドが過剰になる可能性があります。
一方、Async/Await は新しいスレッドを作成しません。現在のスレッドをスレッド プールに渡し、非同期操作が完了するまで待機します。完了すると、最初に待機操作を呼び出したスレッド プール スレッドで継続が実行され、正しいスレッド セマンティクスが確保され、オーバースレッドのリスクが軽減されます。
いつどの方法を使用するか
Task.Start/Wait は、追加の更新や応答を必要としない単純な非同期操作に適しています。また、続行する前にユーザーによる操作の確認を待つなど、スレッドを意図的にブロックする必要がある状況でも使用できます。
Async/Await は、ユーザー インターフェイスの応答性と更新性を維持する必要がある、長時間実行されるユーザー対話型操作に最適です。これにより、複数の非同期操作の処理が簡素化され、手動によるタスク管理の複雑さが回避され、スレッドの効率的な使用が保証されます。
以上が.NET における Task.Start/Wait と Async/Await: それぞれのアプローチをいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。