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

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-15 06:31:46807parcourir

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

Comprendre la restriction C# : await dans les lock déclarations

La documentation C# de Microsoft interdit explicitement l'utilisation du mot-clé await dans une instruction lock. Il ne s'agit pas d'une limitation du compilateur ; c'est un choix de conception délibéré pour éviter une erreur de programmation critique : les blocages.

Le danger d’impasse

Examinons pourquoi la combinaison de await et lock est problématique. Envisagez une tentative courante pour contourner la restriction :

<code class="language-csharp">using (await Async.Lock(padlock))
{
    await SomethingAsync();
}</code>

Bien qu'apparemment anodine, cette approche masque un risque important. L'appel Monitor.Exit dans la méthode ExitDisposable.Dispose peut être bloqué indéfiniment. Cela se produit parce que du code arbitraire peut s'exécuter entre le point où await donne le contrôle et la reprise de la méthode. Ce code intermédiaire pourrait acquérir d'autres verrous, inversant potentiellement l'ordre d'acquisition du verrou et déclenchant un blocage.

La mesure de protection du compilateur

L'interdiction par le compilateur C# de await dans les instructions lock constitue une garantie cruciale. Autoriser cette combinaison augmenterait considérablement la probabilité de blocages, un problème notoirement difficile à déboguer. La restriction empêche les développeurs d’introduire par inadvertance cette dangereuse faille de concurrence. Par conséquent, éviter cette combinaison est essentiel pour une programmation asynchrone robuste et fiable en C#.

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