Maison > développement back-end > C++ > Pourquoi le mélange «Await» et «.Result» dans les opérations asynchrones C # provoque-t-il des impasses?

Pourquoi le mélange «Await» et «.Result» dans les opérations asynchrones C # provoque-t-il des impasses?

Susan Sarandon
Libérer: 2025-01-31 13:31:10
original
385 Les gens l'ont consulté

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

C # Opération asynchrone

et La cause de l'impasse await .Result Lorsque vous utilisez des opérations asynchrones en C #, il est important de comprendre le piège potentiel de la synchronisation mixte et des appels asynchrones. Dans cet exemple, en raison de la ligne de code suivante, le dernier test est en raison des verrous morts:

La raison de l'impasse
Assert.IsTrue(CheckStatus().Result); // 导致挂起
Copier après la connexion

<一> est une méthode asynchrone qui renvoie une tâche de type booléen.

    Lors de l'appel de la tâche
  1. , il essaiera de bloquer le thread actuel jusqu'à la fin de la tâche. CheckStatus()
  2. Cependant, le thread actuel est le thread de test principal, et c'est aussi un thread qui effectue des méthodes asynchrones.
  3. Result Cela mène à une impasse: la méthode asynchrone essaie de continuer à exécuter sur le thread principal, et le thread principal attend que la tâche se termine.
  4. <决> Solution: Évitez les verrous morts
Afin de résoudre le problème des verrous morts, lorsqu'ils traitent des méthodes asynchrones, les opérations de blocage doivent être évitées sur le fil principal. Au contraire, l'utilisation de <算> Le symbole opérationnel permet aux méthodes asynchrones de continuer à s'exécuter sur un autre thread et à renvoyer le contrôle au thread principal.

Le code suivant montre l'utilisation correcte de :

await <免> Évitez d'appeler directement

await

En tant que meilleure pratique, évitez d'utiliser
[Test]
public async Task CheckStatusTwiceResultTest()
{
    Assert.IsTrue(await CheckStatus());
    Assert.IsTrue(await CheckStatus());
}
Copier après la connexion
ou

directement sur la tâche. Au lieu de cela, comptez sur le mode pour vous assurer que les opérations asynchrones sont effectuées en non-bloquants. Result Conclusion

En comprenant les conséquences potentielles du mélange de synchronisation et d'appels asynchrones, les développeurs peuvent utiliser efficacement les méthodes asynchrones en C # sans rencontrer de serrures mortes ou de problèmes de performance. Result

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