ホームページ >バックエンド開発 >C++ >`await` vs.` task.result`:それぞれを使用する必要があり、なぜデッドロックを引き起こすのですか?

`await` vs.` task.result`:それぞれを使用する必要があり、なぜデッドロックを引き起こすのですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-31 13:41:09977ブラウズ

`await` vs. `Task.Result`: When Should You Use Each and Why Does One Cause Deadlocks?

and:使用状況とデッドロックの原因のさまざまな使用awaitTask.Result 非同期コードを処理する場合、結果を得るには

の違いを理解することが重要です。混乱は、特に非同期方法を実装するAPIを使用する場合、死んだロックにつながる可能性があります。 await Task.Result次のテストシーンを検討してください:

このテストでは、最初に非同期メソッド

<code class="language-csharp">[Test]
public async void CheckStatusTwiceResultTest()
{
    Assert.IsTrue(CheckStatus().Result); // 此处挂起
    Assert.IsTrue(await CheckStatus());
}</code>
を使用して結果を取得しようとしました。ただし、この方法は、実際に同期してミッションの完了を実行し、実行スレッドをブロックしているため、ハングします。

これがなぜ起こるのかを理解するには、Task.Resultメソッドを確認する必要があります:CheckStatus

このメソッドは、非同期API呼び出しの場合はを使用します。つまり、実行は応答を待たずに継続することを意味します。これを非同期方法CheckStatusと呼ぶと、実際に実行スレッドをブロックして結果を待ちます。

<code class="language-csharp">private async Task<bool> CheckStatus()
{
    // 进行 REST API 调用
    IRestResponse<dummyservicestatus> response = await restResponse;
    return response.Data.SystemRunning;
}</code>
メソッド自体には非同期操作(REST API呼び出し)が含まれているため、

同期待機を試すと、死んだロックが発生します。メインの実行スレッドはAPI呼び出しの結果を待っており、API呼び出しはメインスレッドが実行を続けるのを待っています。 await Task.Result非同期方法の結果にアクセスする正しい方法は、次のテストに示すように、

キーワードを使用することです。

CheckStatusここでは、Task.Resultを使用して実行スレッドをリリースし、APIが非同期を呼び出して完了します。操作が完了したら、回復を実行し、デッドロックを引き起こすことなくタスクから結果を取得します。

要するに、非同期コードを効果的に処理するために、非同期メソッドを使用する場合は

を避ける必要があることを覚えておいてください。 awaitキーワードを使用して、スレッドをリリースし、そのような問題を防ぐ必要があります。

以上が`await` vs.` task.result`:それぞれを使用する必要があり、なぜデッドロックを引き起こすのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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