Maison >développement back-end >C++ >Comment « rendement » et « attendre » implémentent-ils le contrôle de flux dans .NET ?
.NET Flow Control : une plongée approfondie dans yield
et await
yield
et await
sont des mots-clés .NET fondamentaux permettant un flux de contrôle sophistiqué, simulant la concurrence. Comprendre leurs mécanismes sous-jacents nécessite cependant un examen attentif. Cet article clarifie leur fonctionnalité.
await
La rencontre await
déclenche ces actions d'exécution :
await
attache un délégué de continuation, reprenant l'exécution plus tard.Gestion des données de continuation
Le délégué de continuation généré par await
comprend :
Ces données résident sur le tas, garantissant l'accessibilité même en dehors de la séquence typique d'activation de la pile.
Préservation de la pile d'appels
Contrairement aux piles d'appels standard, les informations cruciales sur les enregistrements d'activation sont initialement allouées au tas. Les enregistrements d'activation de l'appelant ne sont pas stockés, car ils sont consultés après await
.
yield
et gestion de l'état de l'itérateur
yield
, dans les blocs d'itérateur, fonctionne de la même manière que await
. Lors de la rencontre de yield
, l'état local est déplacé vers le tas, avec un pointeur d'instruction pour la prochaine MoveNext
exécution. La gestion des exceptions est intégrée à la gestion interne du bloc itérateur.
Stratégies de gestion des exceptions
Les exceptions non interceptées sont capturées dans la tâche et renvoyées lors de l'accès au résultat de la tâche.
Résumé
La complexité de yield
et await
découle de leur dépendance au style de transmission de continuation (CPS). Le runtime décharge stratégiquement les informations d’activation vers le tas, préservant ainsi le flux de contrôle et l’état de l’itérateur. Bien que comprendre les expressions lambda avec await
soit crucial, explorer davantage CPS, comme détaillé dans les articles de blog d'Eric Lippert sur yield
, les itérateurs et la programmation asynchrone, permet une compréhension plus approfondie.
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!