ホームページ > バックエンド開発 > C++ > Task.Run の待機と非同期の待機: いつどちらを選択すべきですか?

Task.Run の待機と非同期の待機: いつどちらを選択すべきですか?

Linda Hamilton
リリース: 2025-01-22 18:36:13
オリジナル
748 人が閲覧しました

Await Task.Run vs. Await Async: When Should You Choose Which?

.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 には、次のような特定の使用例があります。

    新しいタスクを待たずに開始し、時間のかかる操作をブロックせずに実行できます。
  • CPU に負荷がかかる可能性のある操作をバックグラウンド スレッドで実行し、応答性の高いユーザー インタラクションのために UI スレッドを解放します。

概要

指定されたシナリオでは、両方のメソッドは機能的に同等です。ただし、直接

非同期アプローチを使用すると、スレッドの切り替えが減り、スレッド プールをより効率的に使用できるため、推奨されます。 await

以上がTask.Run の待機と非同期の待機: いつどちらを選択すべきですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート