Maison > développement back-end > C++ > «Await» vs «Task.result»: Quand devriez-vous utiliser chacun et pourquoi provoque-t-il des impasses?

«Await» vs «Task.result»: Quand devriez-vous utiliser chacun et pourquoi provoque-t-il des impasses?

Barbara Streisand
Libérer: 2025-01-31 13:41:09
original
995 Les gens l'ont consulté

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

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

et

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
[Test]
public async void CheckStatusTwiceResultTest()
{
    Assert.IsTrue(CheckStatus().Result); // 此处挂起
    Assert.IsTrue(await CheckStatus());
}
Copier après la connexion
à 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

Cette méthode utilise <进行> pour les appels API asynchrones, ce qui signifie que l'exécution se poursuivra sans attendre la réponse. Lorsque nous appelons cela la méthode asynchrone
private async Task<bool> CheckStatus()
{
    // 进行 REST API 调用
    IRestResponse<dummyservicestatus> response = await restResponse;
    return response.Data.SystemRunning;
}
Copier après la connexion
, 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.

[Test]
public async void CheckOnceAwaitTest()
{
    Assert.IsTrue(await CheckStatus());
}
Copier après la connexion
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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal