Maison >développement back-end >C++ >Comment tâche.
tâche.Aivet vs attente: dangers de blocage dans la programmation .NET asynchrone
Comprendre la différence entre Task.Wait
et await
est primordial lorsque vous travaillez avec des opérations asynchrones dans .NET. Bien que apparemment similaire, une mauvaise utilisation peut entraîner des impasses.
Le problème: une API Web dans l'impasse
L'exemple de code montre trois méthodes asynchrones (Foo
, Bar
, Ros
) appelées à partir d'une ASP.NET Web API Get Point. Le problème se pose lorsque Task.WaitAll
est utilisé pour attendre simultanément dix tâches Ros
. Cela conduit à une impasse.
Task.Wait
vs await
expliqué
Task.Wait
bloque de manière synchrone le thread actuel jusqu'à ce que la tâche attendue se termine. À l'inverse, await
suspend de manière asynchrone la méthode actuelle, renvoyant une tâche incomplète à l'appelant. L'exécution ne reprend que lorsque la tâche attendue se termine.
Pourquoi l'impasse se produit
L'impasse se produit car Task.WaitAll
bloque le thread principal, empêchant les tâches Ros
(dans la boucle) de fonctionner. Ces tâches Ros
dépendent des méthodes asynchrones antérieures (Bar
, Foo
), qui attendent elles-mêmes d'autres tâches. Avec le fil principal bloqué, ces tâches dépendantes ne peuvent pas se terminer, provoquant une impasse.
Éviter le blocage: l'approche préférée
Bien que apparemment tentant, utiliser le blocage coopératif pour résoudre ceci est généralement découragé. Il introduit l'imprévisibilité et complique l'analyse du comportement d'application. La meilleure solution consiste à permettre aux tâches de terminer de manière asynchrone, évitant ainsi les blocs de bloces.
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!