and:使用状況とデッドロックの原因のさまざまな使用await
Task.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 サイトの他の関連記事を参照してください。