C# 非同期プログラミング: await Task.Run
と await
C# 非同期プログラミングでは、await Task.Run
と await
の使用は、特に 2 つの違いが明らかでない場合に混乱を招くことがよくあります。コードの実行を最適化し、潜在的な問題を回避するには、それらの違いを理解することが重要です。
非同期プログラミングの基礎
具体的なシナリオに入る前に、非同期プログラミングの基本を簡単に復習しましょう。 C# の非同期メソッドを使用すると、ノンブロッキングの実行が可能になり、UI スレッドをブロックすることなくタスクを並行して実行できます。
非同期メソッドが呼び出されると、その実行を制御するステート マシンが形成されます。メソッド内で await
キーワードが見つかると、非同期操作がバックグラウンドで継続されている間、呼び出し元に制御が渡されます。操作が完了すると、ステート マシンは await
から実行を再開します。
await Task.Run
vs. await
特定のシナリオでは、await Task.Run(() => LongProcess())
と await LongProcess()
は同等の表現のように見える場合がありますが、その根底には微妙な違いがあります。
await Task.Run(() => LongProcess())
は、LongProcess
メソッドを実行するバックグラウンド スレッドを開始し、現在のスレッドを解放して他のタスクを実行できるようにします。バックグラウンド タスクが完了すると、スレッドは呼び出し元に戻り、実行を継続します。
一方、await LongProcess()
は、LongProcess
メソッド自体が非同期メソッドであることを意味します。この場合、現在のスレッドはバックグラウンド スレッドに制御を与えません。代わりに、LongProcess
に対して非同期ステート マシンが形成され、await
キーワードにより、LongProcess
の非同期操作が完了した後もステート マシンが実行を継続できるようになります。
スレッドの動作の影響
await Task.Run
と await
の違いはスレッドの動作に影響します:
await Task.Run
: 非同期操作を実行するバックグラウンド スレッドを作成します。バックグラウンド タスクの実行中、他のスレッドは実行を継続できます。 await
: 現在のスレッドは一時停止され、非同期メソッドの非同期操作の進行中に他のスレッドが実行できます。 いつどの方法を使用するか
LongProcess
がすでに非同期メソッドである場合、ほとんどの場合、await LongProcess()
の代わりに await Task.Run(() => LongProcess())
を使用することをお勧めします。これにより、LongProcess
の非同期操作の実行中、現在のスレッドの応答性が維持されます。
ただし、LongProcess
が非同期メソッドではない場合、または UI スレッドをブロックするような非常に重い計算を実行する場合は、await Task.Run(() => LongProcess())
を使用してバックグラウンド スレッドに実行を委任することをお勧めします。
以上がAwait Task.Run と Await: 非同期プログラミングでそれぞれのアプローチをいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。