Maison >développement back-end >C++ >Pourquoi ne puis-je pas utiliser « wait » dans une instruction « lock » en 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!