Maison >développement back-end >C++ >Pourquoi ne pouvez-vous pas utiliser « wait » dans une instruction « lock » en C# ?

Pourquoi ne pouvez-vous pas utiliser « wait » dans une instruction « lock » en C# ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-15 11:12:45378parcourir

Why Can't You Use `await` Inside a `lock` Statement in C#?

La raison pour laquelle l'utilisation de lock est interdite dans l'instruction await en C#

En C#, l'opérateur await ne peut pas être utilisé dans une instruction lock, ce qui est un choix de conception délibéré fait par l'équipe du compilateur. Bien que la mise en œuvre de cette fonctionnalité ne soit pas difficile, elle est considérée comme une pratique dangereuse pouvant conduire à des blocages.

La raison de la restriction

Autoriser l'utilisation de lock dans une instruction await entraîne l'exécution de code arbitraire entre le moment où await libère le contrôle et la reprise ultérieure de la méthode. Ce code peut acquérir des verrous dans un ordre qui entre en conflit avec la hiérarchie de verrouillage d'origine, provoquant un blocage.

De plus, await l'exécution peut reprendre sur un thread différent de celui qui a initialement acquis le verrou. Cela conduit à la possibilité de déverrouiller le verrou sur un thread différent de celui qui a acquis le verrou, ce qui est hautement indésirable.

Impact sur la mise en œuvre du verrouillage personnalisé

Les tentatives visant à contourner cette limitation à l'aide d'une implémentation de verrouillage personnalisée (telle que celle fournie dans l'exemple de code donné) peuvent entraîner un comportement imprévisible et potentiellement sujet aux blocages. En effet, l'appel await dans la classe ExitDisposable peut se bloquer indéfiniment si un autre thread acquiert le verrou pendant que l'opération Monitor.Exit est en cours.

Conclusion

Bien que l'opérateur await offre de puissantes capacités de programmation asynchrone, il est important de comprendre l'importance de suivre les meilleures pratiques recommandées, notamment l'interdiction de l'utilisation de lock dans une instruction await. Cette restriction vise à éviter les blocages et à garantir la sécurité et la fiabilité du code multithread.

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