await Task.Run
と await
await Task.Run
と await
の使用は、非同期シナリオ、特に非同期操作 (データベース呼び出しなど) を含むメソッドを扱う場合に混乱を招くことがよくあります。特定のシナリオにおけるこれら 2 つの方法の違いを分析してみましょう。
次のコード スニペットを考えてみましょう:
<code class="language-csharp">await Task.Run(() => LongProcess());</code>
と
<code class="language-csharp">await LongProcess();</code>
LongProcess
は、await ExecuteReaderAsync()
など、複数の非同期呼び出しを行う非同期メソッドです。
これら 2 つのメソッドの主な違いは、処理メソッドの基礎となるメカニズムです。
await Task.Run(() => LongProcess())
: この構文は、LongProcess
メソッドの実行を現在のスレッド プールの外部の別のスレッドに委任します。これにより、LongProcess
メソッドが別のスレッドで非同期に実行されている間、現在のスレッドは他のコードの実行を継続できます。 await LongProcess()
: この場合、LongProcess
メソッドの実行は別のスレッドに委任されません。代わりに、現在のスレッドは、LongProcess
メソッドが非同期操作を完了するまで実行を一時停止します。 これら 2 つの方法のどちらを選択するかは、必要な実行時の動作とリソースの使用状況によって異なります。
Task.Run
を使用する方が適切です。ただし、このアプローチでは、スレッドの作成とコンテキストの切り替えにより追加のオーバーヘッドが発生します。 await
を使用することをお勧めします。ただし、このアプローチでは、LongProcess
の非同期操作が完了するのを待機している間に現在のスレッドがブロックされる可能性があります。 await Task.Run
と await
の違いは、基礎となるスレッド管理メカニズムにあります。 await Task.Run
は非同期メソッドの新しいスレッドを作成し、await
は現在のスレッドを一時停止します。望ましい運用動作とリソースの使用状況に基づいて、適切な方法を選択する必要があります。
以上がAwait Task.Run と Await: いつどちらを使用するべきですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。