Maison > développement back-end > C++ > Await vs tâche.Atthes: Pourquoi l'utilisation de la tâche est-elle provoque des impasses?

Await vs tâche.Atthes: Pourquoi l'utilisation de la tâche est-elle provoque des impasses?

DDD
Libérer: 2025-02-02 02:51:08
original
852 Les gens l'ont consulté

Await vs. Task.Wait: Why Does Using Task.Wait Cause Deadlocks?

et await: La racine de l'impasse Task.Wait

et

La différence de programmation asynchrone est légèrement importante. Cet article explore les différences entre les deux et analyse les scènes d'impasse communes. await Task.Wait tâche.Aivent: blocage synchrone

Couvrir simultanément le thread d'appel jusqu'à la fin de la tâche. Cela a essentiellement suspendu le fil et attendu l'exécution de la tâche.

Await: suspension asynchrone

Task.Wait

En revanche,

L'exécution de la méthode actuelle asynchrone. L'état de la méthode a été capturé et une tâche inachevée est retournée à l'appelant. Lorsque l'expression d'attente est terminée, la partie restante de la méthode est prévue à fonctionner en continu. Scène de verrouillage mort

await Compte tenu des exemples de code suivants, dans lesquels l'erreur utilise

mèner à la verrouillage mort:

Dans ce code, la méthode

bloque le thread actuel, en attendant que toutes les tâches de la collection se terminent. Cependant, chaque méthode contient une expression

qui pend son exécution. Task.Wait

Lorsque le thread d'appel est bloqué dans
<code>Task.WaitAll(Enumerable.Range(0, 10).Select(x => Ros()).ToArray());</code>
Copier après la connexion
, l'expression

dans la tâche ne peut pas être terminée. Cela génère des verrous morts car la tâche ne peut pas continuer à être exécutée à moins que l'appel ne soit appelé pour libérer son obstruction; Task.WaitAll Ros() Pourquoi le bloc attend-il pour éviter les verrous morts await

En utilisant l'obstruction en attente, comme Task.WaitAll ou verrouillage, il ne provoquera pas de verrouillage mort dans cette scène, car elle n'empêchera pas la tâche d'être exécutée sur un thread séparé. L'attente d'obstruction n'est que l'exécution de la méthode d'appel de retard, permettant à la tâche de continuer et enfin de terminer. await

Conclusion

Pour éviter les serrures mortes, assurez-vous de comprendre la différence entre

et

. D'une manière générale, Thread.Sleep est toujours utilisée dans le code asynchrone pour s'assurer que le thread d'appel est maintenu.

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal