ホームページ >バックエンド開発 >C++ >C#Async操作で「待ち望まれている」と「.Result」を混ぜると、なぜデッドロックを引き起こすのですか?

C#Async操作で「待ち望まれている」と「.Result」を混ぜると、なぜデッドロックを引き起こすのですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-31 13:31:10392ブラウズ

Why Does Mixing `await` and `.Result` in C# Async Operations Cause Deadlocks?

c#非同期操作

およびデッドロックの原因awaitC#で非同期操作を使用する場合、混合同期と非同期呼び出しの潜在的なトラップを理解することが重要です。この例では、次のコードラインのため、最後のテストは死んだロックのためにハングします:.Result

デッドロックの理由

<code class="language-csharp">Assert.IsTrue(CheckStatus().Result); // 导致挂起</code>

は、ブール型タスクを返す非同期方法です。 タスクを呼び出すと、タスクが完了するまで現在のスレッドをブロックしようとします。

    ただし、現在のスレッドはメインテストスレッドであり、非同期方法を実行するスレッドでもあります。
  1. CheckStatus()これはデッドロックにつながります:非同期方法はメインスレッドで実行を継続しようとしており、メインスレッドはタスクが完了するのを待っています。
  2. Result解決策:死んだロックを避けてください
  3. 死んだロックの問題を解決するには、非同期方法を扱う場合、メインスレッドでのブロッキング操作を避ける必要があります。それどころか、の使用により、動作記号を使用すると、非同期方法が別のスレッドで実行され続け、コントロールをメインスレッドに戻すことができます。
  4. 次のコードは、
の正しい使用法を示しています:

直接電話をかけることは避けてください

ベストプラクティスとして、タスクで直接

またはawaitを使用しないようにしてください。代わりに、非同期操作が非ブロッキングで実行されることを確認するために、モードに依存します。

結論await

<code class="language-csharp">[Test]
public async Task CheckStatusTwiceResultTest()
{
    Assert.IsTrue(await CheckStatus());
    Assert.IsTrue(await CheckStatus());
}</code>
同期と非同期呼び出しの混合の潜在的な結果を理解することにより、開発者は、死んだロックやパフォーマンスの問題に遭遇することなく、C#で非同期方法を効果的に使用できます。

以上がC#Async操作で「待ち望まれている」と「.Result」を混ぜると、なぜデッドロックを引き起こすのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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