Comment puis-je continuer à exécuter mon application console jusqu'à ce qu'une touche Escsoit enfoncée (comme c'est le cas?)
Je suppose que son enroulé autour d'une boucle while. Je n'aime pas ReadKey
car il bloque le fonctionnement et demande une clé, plutôt que de simplement continuer et écouter la pression de la touche.
Comment cela peut-il être fait?
c#
console-application
karlstackoverflow
la source
la source
Console.ReadLine()
et vous êtes prêt, non?Vous pouvez modifier légèrement votre approche - utilisez
Console.ReadKey()
pour arrêter votre application, mais faites votre travail dans un fil d'arrière-plan:Dans la
myWorker.DoStuff()
fonction, vous invoqueriez ensuite une autre fonction sur un thread d'arrière-plan (en utilisantAction<>()
ouFunc<>()
est un moyen facile de le faire), puis revenez immédiatement.la source
Le chemin le plus court:
Console.ReadKey()
est une fonction de blocage, elle arrête l'exécution du programme et attend une pression sur la touche, mais grâce à la vérificationConsole.KeyAvailable
préalable, lawhile
boucle n'est pas bloquée, mais en cours d'exécution jusqu'à ce que la Esctouche soit enfoncée.la source
Extrait de la malédiction vidéo Building .NET Console Applications in C # par Jason Roberts sur http://www.pluralsight.com
Nous pourrions suivre pour avoir plusieurs processus en cours d'exécution
la source
Console.CursorVisible = false;
sera préférable d'éviter les problèmes de clignotement du curseur. Ajoutez cette ligne comme première ligne dustatic void Main(string[] args)
bloc.Voici une approche pour que vous puissiez faire quelque chose sur un autre thread et commencer à écouter la touche enfoncée dans un autre thread. Et la console arrêtera son traitement lorsque votre processus réel se terminera ou que l'utilisateur mettra fin au processus en appuyant sur la Esctouche.
la source
Si vous utilisez Visual Studio, vous pouvez utiliser "Démarrer sans débogage" dans le menu Déboguer.
Il écrira automatiquement "Appuyez sur n'importe quelle touche pour continuer ...". à la console pour vous à la fin de l'application et il laissera la console ouverte pour vous jusqu'à ce qu'une touche soit enfoncée.
la source
Traiter les cas que certaines des autres réponses ne gèrent pas bien:
La plupart des solutions de cette page impliquent l'interrogation
Console.KeyAvailable
ou le blocageConsole.ReadKey
. S'il est vrai que le .NETConsole
n'est pas très coopératif ici, vous pouvez l'utiliserTask.Run
pour évoluer vers unAsync
mode d'écoute plus moderne .Le principal problème à savoir est que, par défaut, votre thread de console n'est pas configuré pour
Async
fonctionner - ce qui signifie que, lorsque vous tombez du bas de votremain
fonction, au lieu d'attendre laAsync
fin, votre AppDoman et votre processus se terminent . Une bonne façon de résoudre ce problème serait d'utiliser AsyncContext de Stephen Cleary pour établir uneAsync
prise en charge complète dans votre programme de console à thread unique. Mais pour les cas plus simples, comme l'attente d'une pression sur une touche, l'installation d'un trampoline complet peut être exagéré.L'exemple ci-dessous serait pour un programme de console utilisé dans une sorte de fichier batch itératif. Dans ce cas, lorsque le programme a terminé son travail, il doit normalement quitter sans nécessiter de pression sur une touche, puis nous autorisons une pression de touche facultative pour empêcher l'application de se fermer. Nous pouvons interrompre le cycle pour examiner les choses, éventuellement reprendre, ou utiliser la pause comme un «point de contrôle» connu pour sortir proprement du fichier de commandes.
la source
avec le code ci-dessous, vous pouvez écouter la barre d'espace en appuyant sur, au milieu de l'exécution de votre console et faire une pause jusqu'à ce qu'une autre touche soit appuyée et également écouter EscapeKey pour rompre la boucle principale
la source
D'après mon expérience, dans les applications console, la façon la plus simple de lire la dernière touche enfoncée est la suivante (exemple avec les touches fléchées):
J'utilise pour éviter les boucles, à la place j'écris le code ci-dessus dans une méthode, et je l'appelle à la fin de "Method1" et "Method2", donc, après avoir exécuté "Method1" ou "Method2", Console.ReadKey () .Key est prêt à relire les clés.
la source