ホームページ >バックエンド開発 >C++ >Task.Run を使用して非同期メソッドを同期的に呼び出すにはどうすればよいですか?

Task.Run を使用して非同期メソッドを同期的に呼び出すにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-19 13:47:09945ブラウズ

How Can I Synchronously Call an Asynchronous Method Using Task.Run?

Task.Run を使用して非同期メソッドを同期的に呼び出す

非同期プログラミングを使用すると、メインスレッドをブロックすることなく、長時間実行される操作を実行できます。ただし、場合によっては、非同期メソッドを同期的に呼び出す必要がある場合があります。 Task.Run を使用してこれを実現する方法は次のとおりです:

シーン:

次の非同期メソッドを考えてみましょう:

<code class="language-c#">public async Task<string> GenerateCodeAsync()
{
    string code = await GenerateCodeService.GenerateCodeAsync();
    return code;
}</code>

このメソッドを別の同期メソッドから同期的に呼び出す必要があるとします。

解決策:

非同期メソッドを同期的に実行するには、Task.Run メソッドを使用してスレッド プール スレッドで実行できます。

<code class="language-c#">string code = Task.Run(() => GenerateCodeAsync()).GetAwaiter().GetResult();</code>

このコードでは次の手順を使用します:

  1. Task.Run: バックグラウンド スレッド プール タスクを作成し、GenerateCodeAsync メソッドを実行します。
  2. GetAwaiter(): 非同期操作の結果を表すタスクの待機者を取得します。
  3. GetResult(): 非同期操作が完了し、メソッドの結果を返すまで、呼び出し元のスレッドをブロックします。

.Result を直接使用する場合の欠点:

タスクの Result プロパティに直接アクセスする単純な方法 (つまり string code = GenerateCodeAsync().Result;) は、次のような欠点があるため避けてください。

  • デッドロック: 非同期メソッドがブロック中に UI スレッドにアクセスしようとすると、このメソッドはデッドロックを引き起こす可能性があります。 Task.Run はメソッドを別のスレッドで実行するため、この問題は回避されます。
  • 例外処理: .Result 非同期メソッドでスローされた例外を AggregateException でラップします。 を使用することでこの問題を回避し、例外を直接受け取ります。 .GetAwaiter().GetResult()

以上がTask.Run を使用して非同期メソッドを同期的に呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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