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

C# で非同期メソッドを同期的に呼び出すにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-19 13:43:10
オリジナル
795 人が閲覧しました

How Can I Synchronously Invoke an Asynchronous Method in C#?

非同期メソッドを同期的に呼び出す

質問:

次のシグネチャを持つ非同期メソッドがあります:

<code class="language-c#">public async Task<string> GenerateCodeAsync()
{
    string code = await GenerateCodeService.GenerateCodeAsync();
    return code;
}</code>
ログイン後にコピー

ただし、このメソッドは同期コンテキストで同期的に呼び出す必要があります。それを達成するにはどうすればよいでしょうか?

解決策:

非同期メソッドを同期的に呼び出すには、スレッド プール スレッドを使用してメソッドを実行できます。タスクの待機者を使用すると、非同期操作が完了するまで呼び出し元のスレッドをブロックできます:

<code class="language-c#">string code = Task.Run(() => GenerateCodeAsync())
                 .GetAwaiter()
                 .GetResult();</code>
ログイン後にコピー

注:

.Result を直接使用する場合の欠点に注意する必要があります。

  1. デッドロック: .Result を使用すると、メインスレッドがブロックされ、非同期メソッドが完了できなくなるため、デッドロックが発生する可能性があります。これを防ぐには、.ConfigureAwait(false) を慎重に使用してください。このアプローチには複雑さが伴います。ただし、Task.Run を使用してスレッド プールのスレッドで非同期メソッドを実行すると、この潜在的な問題は解消されます。
  2. 例外処理: .Result 非同期メソッドでスローされた例外を AggregateException にカプセル化します。この問題を回避するには、代わりに .GetAwaiter().GetResult() を使用してください。

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

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