非同期メソッドを同期的に呼び出す
質問:
次のシグネチャを持つ非同期メソッドがあります:
<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
を直接使用する場合の欠点に注意する必要があります。
.Result
を使用すると、メインスレッドがブロックされ、非同期メソッドが完了できなくなるため、デッドロックが発生する可能性があります。これを防ぐには、.ConfigureAwait(false)
を慎重に使用してください。このアプローチには複雑さが伴います。ただし、Task.Run
を使用してスレッド プールのスレッドで非同期メソッドを実行すると、この潜在的な問題は解消されます。 .Result
非同期メソッドでスローされた例外を AggregateException
にカプセル化します。この問題を回避するには、代わりに .GetAwaiter().GetResult()
を使用してください。 以上がC# で非同期メソッドを同期的に呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。