Opération asynchrone C# bloquée dans la propriété Task.Result : explication détaillée du blocage
La programmation asynchrone utilisant les mots-clés async et wait de C# peut parfois produire un comportement déroutant. Cet article examine un scénario dans lequel une opération asynchrone s'arrête au niveau de la propriété Result d'une tâche.
Description du problème
Le développeur a rencontré ce problème dans une application classique à trois niveaux qui utilisait une méthode asynchrone pour récupérer les données. La méthode ExecuteAsync
démarre l'opération SQL sur le thread du pool de threads, et la méthode suivante GetTotalAsync
utilise wait pour accéder aux résultats. Toutefois, lorsque la méthode de l'interface utilisateur accède à la propriété Result de la tâche asynchrone, l'application se bloque.
Cause fondamentale : impasse
La racine du problème réside dans une erreur courante lors de l'utilisation de la bibliothèque parallèle de tâches (TPL). Par défaut, le runtime planifie la continuation d'une fonction sur le même SynchronizationContext qui a initialement lancé la méthode. Dans la plupart des cas, ce comportement est idéal. Cependant, lorsque l'opération est démarrée sur le thread de l'interface utilisateur, puis bloquée par un appel à Result, un blocage peut en résulter.
Solution
Afin de sortir de l'impasse, il existe plusieurs méthodes :
.ConfigureAwait(false)
à l'instruction wait garantit que la suite est toujours planifiée sur le pool de threads, quel que soit le contexte d'appel. Autres notes
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!