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
Susan Sarandonoriginal
2025-01-31 13:31:10405parcourir

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
<code class="language-csharp">Assert.IsTrue(CheckStatus().Result); // 导致挂起</code>

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
<code class="language-csharp">[Test]
public async Task CheckStatusTwiceResultTest()
{
    Assert.IsTrue(await CheckStatus());
    Assert.IsTrue(await CheckStatus());
}</code>
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:
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