ホームページ >バックエンド開発 >C++ >Async/Await で「Task.Run」を使用する必要があるのはどのような場合ですか?

Async/Await で「Task.Run」を使用する必要があるのはどのような場合ですか?

DDD
DDDオリジナル
2025-01-03 13:42:40736ブラウズ

When Should I Use `Task.Run` with Async/Await?

Async/Await を理解する: Task.Run を使用する場合

非同期プログラミングの領域では、非同期メソッド ( async)と非同期実行(バックグラウンド スレッド)。ニュアンスを詳しく調べるために、次のシナリオを検討してみましょう。

シナリオ 1: バックグラウンド スレッドなし

private async Task DoWork1Async()
{
    int result = 1 + 2;
}

この例では、メソッドは非同期としてマークされていますが、バックグラウンドでの実行を必要としない簡単な操作を実行します。したがって、待機している DoWork1Async() は同期的に実行されます。

シナリオ 2: バックグラウンド スレッドで実行

private async Task DoWork2Async()
{
    Task.Run( () =>
    {
        int result = 1 + 2;
    });
}

ここでも、メソッドは非同期としてマークされていますが、実際の操作を Task.Run にラップします。これにより、操作がバックグラウンド スレッドで確実に実行されます。ただし、バックグラウンド スレッド操作が待機されていないため、待機中の DoWork2Async() は同期的に実行されます。

メソッドの戻り値の型と非同期動作

メソッドの戻り値の型メソッドはその非同期動作にも影響を与える可能性があります。 タスクまたはタスクを返すメソッド これは、非同期メソッド内で await を使用して実行を一時停止し、待機中のタスクが完了したときに再開できることを意味します。

非同期実行の Task.Run

メソッドを待機可能にし、その操作をバックグラウンド スレッドで実行するには、を使用する必要がありますTask.Run を使用して新しいタスクを作成します。 このアプローチは、同期コードと非同期コードを明確に分離できるため、メソッド全体を Task.Run でラップするよりも適切です。

private Task<int> DoWorkAsync() // No async because the method does not need await
{
  return Task.Run(() =>
  {
    return 1 + 2;
  });
}

ベスト プラクティス

  • バックグラウンド スレッドに Task.Run を使用する
  • Task.Run で同期メソッドをラップしないでください。コンシューマがそれらを実行する方法を決定できます。
  • 非同期コードを作成するには、宣言的な async/await 構文を採用します。
  • 詳細については、async に関する MSDN ドキュメントを参照してください。

以上がAsync/Await で「Task.Run」を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。