Maison >développement back-end >C++ >«Await» vs «Task.result»: Quand devriez-vous utiliser chacun et pourquoi provoque-t-il des impasses?
et : utilisation différente de l'utilisation et de la cause de l'impasse await
Task.Result
Lors du traitement du code asynchrone, il est important de comprendre la différence entre
pour obtenir des résultats. La confusion peut entraîner des verrous morts, en particulier lors de l'utilisation d'API qui implémentent les méthodes asynchrones. await
Task.Result
Considérez la scène de test suivante:
Dans ce test, nous avons d'abord essayé d'utiliser
<code class="language-csharp">[Test] public async void CheckStatusTwiceResultTest() { Assert.IsTrue(CheckStatus().Result); // 此处挂起 Assert.IsTrue(await CheckStatus()); }</code>à partir de la méthode asynchrone
pour obtenir le résultat. Cependant, cette méthode sera suspendue car nous effectuons réellement l'achèvement de la mission en synchronisation et en bloquant le thread d'exécution. Task.Result
CheckStatus
Pour comprendre pourquoi cela se produit, nous devons vérifier la méthode
CheckStatus
<code class="language-csharp">private async Task<bool> CheckStatus() { // 进行 REST API 调用 IRestResponse<dummyservicestatus> response = await restResponse; return response.Data.SystemRunning; }</code>, elle bloquera en fait le thread d'exécution et attendra les résultats.
await
Parce que la méthode lui-même contient des opérations asynchrones (appels API REST), l'essai de l'attente synchrone Task.Result
provoquera des serrures mortes. Le fil d'exécution principal attend les résultats de l'appel API, et l'appel API attend que le thread principal continue de s'exécuter.
La méthode correcte pour accéder au résultat de la méthode asynchrone consiste à utiliser CheckStatus
Mots-clés, comme le montre le test suivant: Task.Result
Ici, nous utilisons await
pour libérer le thread d'exécution, permettant à l'API d'appeler Asynchrone à terminer. Une fois l'opération terminée, effectuez la récupération et obtenez les résultats de la tâche sans provoquer de verrous morts.
<code class="language-csharp">[Test] public async void CheckOnceAwaitTest() { Assert.IsTrue(await CheckStatus()); }</code>En bref, afin de gérer efficacement le code asynchrone, n'oubliez pas que
doit être évité lors de l'utilisation de méthodes asynchrones car elle peut provoquer des serrures mortes. await
Les mots clés doivent être utilisés pour libérer des threads et empêcher ces problèmes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!