Comprendre les blocages avec await
et .Result
en C #
Votre test est accroché à CheckStatus().Result
en raison d'un malentendu fondamental de la programmation asynchrone en C #. Clarifions le problème.
Opérations asynchrones en C #
La programmation asynchrone permet aux opérations d'exécuter simultanément sans bloquer le thread principal. async
et await
sont les mots clés qui facilitent cela en C #.
Le rôle de await
await
Utilise l'exécution dans une méthode async
jusqu'à ce que la tâche attendue se termine. Surtout, le thread principal reste débloqué, permettant à un autre code de s'exécuter.
Les pièges de .Result
La propriété .Result
d'un objet Task
, cependant, récupère le résultat synchrone . Cela signifie que le thread d'appel est bloqué jusqu'à la fin de la tâche. Ce comportement de blocage est la cause profonde des impasses lorsqu'elles sont mal utilisées avec await
.
Le scénario de l'impasse
Dans votre test d'échec, CheckStatus().Result
force l'exécution synchrone de la méthode async
. Avant que cela ne termine, un autre await CheckStatus()
est tenté. Ce deuxième await
échoue car le premier appel (via .Result
) bloque toujours le thread, créant une impasse.
L'approche correcte
Pour empêcher les blocs de bloces, utilisez systématiquement await
pour gérer les résultats des méthodes async
. Évitez d'appeler .Result
directement. Cela garantit que les opérations asynchrones se déroulent sans blocage de fil.
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!