Maison >développement back-end >C++ >Pourquoi mon appel HttpClient.GetAsync se bloque-t-il lors de l'utilisation d'Await/Async dans ASP.NET ?

Pourquoi mon appel HttpClient.GetAsync se bloque-t-il lors de l'utilisation d'Await/Async dans ASP.NET ?

DDD
DDDoriginal
2025-01-25 13:23:08752parcourir

Why Does My HttpClient.GetAsync Call Hang When Using Await/Async in ASP.NET?

La raison pour laquelle HttpClient.GetAsync(...) se bloque lors de l'utilisation d'Await/Async dans ASP.NET

Dans ASP.NET, un seul thread peut gérer une requête à la fois. Bien que le traitement parallèle soit possible, un seul thread possède le contexte de la requête. Cette gestion des threads est contrôlée par ASP.NET SynchronizationContext.

En attendant une tâche, les méthodes reprennent généralement sur le SynchronizationContext capturé (ou TaskScheduler s'il n'existe pas). Ceci est cohérent avec le comportement attendu des opérations de contrôleur asynchrone.

Problème dans le cas de test 5

Le blocage dans Test5Controller.Get est dû à la séquence suivante :

  1. Appelez HttpClient.GetAsync dans le contexte de requête ASP.NET.
  2. HttpClient.GetAsync envoie une requête HTTP et renvoie une tâche inachevée.
  3. AsyncAwait_GetSomeDataAsync attend une tâche et renvoie une tâche inachevée car la requête est toujours en cours.
  4. Test5Controller.Get bloque le thread actuel jusqu'à ce que la tâche renvoyée par AsyncAwait_GetSomeDataAsync soit terminée.
  5. Réponse HTTP reçue, tâche HttpClient.GetAsync terminée.
  6. AsyncAwait_GetSomeDataAsync tente de reprendre dans le contexte d'une requête ASP.NET.
  7. Un blocage se produit car le thread bloqué dans Test5Controller.Get contient toujours le contexte de la requête.

Résoudre le problème

Il existe quelques bonnes pratiques qui peuvent être mises en œuvre pour éviter des problèmes similaires :

  • Utilisez ConfigureAwait(false) dans les méthodes asynchrones de la bibliothèque pour distribuer des continuations en dehors du contexte de requête ASP.NET.
  • Évitez de bloquer les tâches en utilisant wait au lieu de GetResult ou Task.Wait.

Conclusion

Comprendre le rôle de SynchronizationContext et les meilleures pratiques d'utilisation de la technologie async/await peut garantir un fonctionnement efficace et sans blocage lorsque vous travaillez avec du code asynchrone dans ASP.NET.

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