.NET 非同期プログラミング: await Task.Run
メソッドと await Async
メソッドの選択
.NET 非同期プログラミングでは、await Task.Run
および await
非同期メソッドの使用が混乱を招くことがよくあります。この記事では、具体的なシナリオを通じて 2 つの違いを説明し、包括的な理解を提供します。
シーン:
次の 2 つのコード スニペットを考えてみましょう:
<code class="language-csharp">await Task.Run(() => LongProcess());</code>
と
<code class="language-csharp">await LongProcess();</code>
LongProcess
は、await ExecuteReaderAsync()
などの非同期呼び出しを含む非同期メソッドです。
答え:
この特定のシナリオでは、2 つの方法の間に大きな違いはありません。どちらも await
キーワードを使用して、LongProcess
の非同期操作が完了する前に呼び出し元に制御を返します。
非同期実行の性質
一般に信じられていることに反して、非同期コードは複数のスレッドで実行されません。代わりに、「コンテキスト切り替え」と呼ばれる技術を利用して、スレッド上で実行されます。
非同期関数が別の非同期関数を呼び出すと、現在のスレッドは呼び出し元の実行を一時的に中断し、呼び出し先の実行を継続します。その後、オペレーティング システムは、中断されたスレッドを他の利用可能なタスクに割り当てます。
ただし、呼び出し先で await
ステートメントが見つかると、現在のスレッドは呼び出し元に戻り、呼び出し元の実行が効果的に再開されます。
直接await
非同期メソッドの利点
指定されたシナリオでは、LongProcess
はすでに非同期メソッドであるため、await
の前に明示的に Task.Run
でラップする必要はありません。直接 await
非同期メソッドを使用すると、スレッドは LongProcess
が完了するのを待っている間、すぐに他のタスクの実行を開始できます。
Task.Run
使用シナリオ
Task.Run
には、次のような特定の使用例があります。
概要
指定されたシナリオでは、両方のメソッドは機能的に同等です。ただし、直接 非同期アプローチを使用すると、スレッドの切り替えが減り、スレッド プールをより効率的に使用できるため、推奨されます。 await
以上がTask.Run の待機と非同期の待機: いつどちらを選択すべきですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。