await Task.Run
: 必要か否か?非同期メソッド内で await Task.Run
を使用すると、混乱が生じることがよくあります。 これを例で明確にしてみましょう:
<code class="language-csharp">await Task.Run(() => LongProcess());</code>
との比較:
<code class="language-csharp">await LongProcess();</code>
LongProcess
は、複数の非同期呼び出しを含む非同期メソッド (例: DbDataReader.ExecuteReaderAsync()
)。
主な違い:
この場合、await Task.Run
は冗長です。 すでに非同期メソッド内に不要な追加タスクが導入されます。非同期メソッドはすでにスレッド プールを介して同時実行性を活用しています。 Task.Run
を追加すると、不要なオーバーヘッドが発生します。
説明:
Async/await は、ノンブロッキングのコード実行を容易にします。 スレッドは、非同期操作の完了を待機している間、他のタスクの処理を続けます。 非同期メソッドが呼び出されても、スレッドはブロックされません。 await
キーワードを使用すると、操作の終了後にスレッドが実行を再開できます。
重要な考慮事項:
await
で一時停止し、待機中のタスクが完了すると再開します。 コンテキストの切り替えには内部でさまざまなスレッドが関与する可能性がありますが、論理フローは主にシングルスレッドのままです。Task.Run
は 有益です。 計算をバックグラウンド スレッドにオフロードすることで、メイン UI スレッドのブロックが防止され、応答性が確保されます。結論:
提示されたシナリオでは、await LongProcess()
を直接使用することが最適でより効率的なアプローチです。 非同期メソッドは本質的に同時実行性を処理します。 Task.Run
を追加してもメリットはなく、複雑さが増します。
以上が非同期メソッドで「await Task.Run」を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。