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
Susan Sarandonoriginal
2025-01-01 08:15:111031parcourir

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!

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