Maison >développement back-end >C++ >Comment « rendement » et « attendre » gèrent-ils le flux de contrôle dans .NET ?
Mécanisme de flux de contrôle de yield
et await
dans .NET
Votre compréhension des mots-clés yield
et await
dans .NET est généralement correcte. yield
Permet au bloc itérateur de rendre le contrôle au code appelant et de reprendre l'exécution là où elle s'était arrêtée lorsque l'itérateur est à nouveau appelé. await
Non seulement attend que l'appelé termine, mais rend également le contrôle à l'appelant. Lorsque l'appelant await
la méthode à nouveau, l'exécution reprendra là où elle s'était arrêtée.
La clé pour comprendre ces structures réside dans leurs mécanismes de mise en œuvre. Pour await
, cela équivaut essentiellement à un « retour de haut niveau ». Lorsqu'une expression await
est rencontrée, le runtime vérifie si la tâche est terminée. S'il n'est pas terminé, il alloue un délégué, exécute le reste de la méthode dans le prolongement de la tâche et le renvoie à l'appelant. Si la tâche est terminée, le reste de la méthode est exécuté immédiatement.
await
contient un numéro qui identifie le prochain pointeur d'instruction à exécuter dans une table de recherche. Cela garantit que lorsque la tâche reprend, elle continue son exécution à partir du bon emplacement. Les continuations stockent également les valeurs de toutes les variables locales et temporaires, permettant à une méthode de reprendre son exécution comme si elle n'avait jamais été interrompue.
Quant à la question de savoir comment le runtime gère plusieurs appels de méthode avant await
, la réponse est que l'enregistrement d'activation de l'appelant et l'enregistrement d'activation de la méthode qu'il appelle ne sont pas stockés dans la même pile. Au lieu de cela, await
les informations pertinentes pour la récupération sont stockées sur le tas. Cela garantit que la pile n'est pas écrasée par les appels de méthode ultérieurs.
Si une exception non gérée se produit, elle est interceptée et stockée dans la tâche. Cette exception sera à nouveau levée lorsque les résultats de la tâche seront obtenus. Ce comportement garantit que les exceptions sont gérées correctement même en présence d'opérations asynchrones.
Un principe similaire s'applique à la mise en œuvre de yield
. Lorsque l'itérateur bloque yield
une valeur, l'état des variables locales est copié dans le tas, accompagné d'un numéro indiquant l'instruction MoveNext
qui doit reprendre l'exécution au prochain appel de l'itérateur. Cela permet à l'itérateur de suspendre l'exécution au point yield
et de reprendre l'exécution plus tard sans perdre aucun état.
En exploitant ces mécanismes complexes, les mots-clés yield
et await
offrent un moyen puissant d'implémenter des opérations asynchrones et itératives dans .NET. Ils permettent de simuler la concurrence sans avoir besoin de threads, simplifiant ainsi le code et améliorant les performances.
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!