Maison > développement back-end > C++ > Comment l'exécution du code reprend-elle après « attente » dans une application monothread ?

Comment l'exécution du code reprend-elle après « attente » dans une application monothread ?

Susan Sarandon
Libérer: 2025-01-01 08:15:11
original
1014 Les gens l'ont consulté

How Does Code Execution Resume After `await` in a Single-Threaded Application?

Comprendre l'exécution du thread après le mot clé « attendre »

Question :

Dans une application console à thread unique, comment peut-on coder après l'exécution du mot clé wait puisque le thread est verrouillé par task.Wait() ? Un nouveau thread prend-il le relais ou le thread principal quitte-t-il d'une manière ou d'une autre task.Wait() pour exécuter le 后续代码 ?

Réponse :

Mécanisme d'exécution :

Lorsque le mot clé wait est rencontré dans une méthode asynchrone comme MyAsyncMethod(), le code restant dans la méthode est considéré comme une continuation. Le mot clé wait suspend effectivement l'exécution de la méthode jusqu'à ce que la tâche en attente (par exemple, MyOtherAsyncMethod()) se termine.

Suite du thread :

Par défaut, la suite de une méthode asynchrone s'exécute sur le même contexte de synchronisation que le code avant le mot clé wait. Dans le cas d'une application d'interface utilisateur, cela signifie que le code après l'attente s'exécutera sur le thread principal de l'interface utilisateur.

Scénario dans une application à thread unique :

Dans Cependant, une application console à thread unique appelant task.Wait() bloque l'exécution du thread principal. Par conséquent, le code de continuation après wait ne peut pas s'exécuter car le thread est effectivement verrouillé.

Résolution :

Pour permettre au code de continuation de s'exécuter dans une application monothread, vous avez deux options :

  • Utiliser SynchronizationContext.Post() : Cette méthode vous permet de publier une suite déléguez au contexte de synchronisation actuel, qui sera exécuté lorsque le thread bloqué deviendra disponible.
  • Utilisez Task.ConfigureAwait(false): Cette méthode exprime explicitement que le code de continuation ne nécessite pas d'exécution sur le même fil. Il permet à la suite de s'exécuter sur n'importe quel thread du pool de threads disponible, même si le thread bloquant est occupé.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal