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

C# でデッドロックを発生させずに非同期メソッドを同期的に呼び出すにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-19 13:52:12372ブラウズ

How Can I Synchronously Call an Asynchronous Method in C# Without Deadlocks?

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

タスクを返す非同期メソッド、たとえば GenerateCodeAsync() があるとします。このメソッドを同期的に呼び出すには、同期コードと非同期コードを調整する方法を見つける必要があります。

1 つの解決策は、スレッド プール スレッドで非同期メソッドを実行し、awaiter を使用して操作が完了するまでスレッドをブロックすることです。

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

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

プロパティへの直接アクセスでは、次の結果が生じる可能性があります: Result

  • デッドロック: への呼び出しはメインスレッドをブロックし、非同期コードの実行を防ぎます。 Result
  • AggregateExceptions: 非同期メソッドによってスローされた例外はすべて でラップされます。 AggregateException
これらの問題を回避するには、

メソッド: GetAwaiter().GetResult()

    デッドロックを回避するために、スレッド プールのスレッドで非同期メソッドを実行します。
  • 追加のブロック ハンドラーを使用せずに、スローされた例外をアンラップしてアクセスします。

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

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