Comment puis-je recouvrir ctrl-c (SIGINT) dans une console C# app
Je voudrais être capable de piéger CTRL+C dans une application console C# afin que je puisse mener à bien certaines nettoyage avant de quitter. Quelle est la meilleure façon de le faire?
Vous devez vous connecter pour publier un commentaire.
Voir MSDN:
Console.Événement Cancelkeypress
Article avec des exemples de code:
Ctrl-C et de l' .NET application console
CancelKeyPress
est mentionné que brièvement dans les commentaires. Un bon article, codeneverwritten.com/2006/10/...La Console.L'événement cancelkeypress événement est utilisé pour cela. C'est la façon dont il est utilisé:
Lorsque l'utilisateur appuie sur Ctrl + C dans le code du délégué est exécutée et le programme s'arrête. Cela vous permet d'effectuer un nettoyage en appelant approprié des méthodes. Notez qu'aucun code d'après le délégué est exécutée.
Il existe d'autres situations où ce ne sera pas coupé. Par exemple, si le programme est en cours d'exécution importants calculs qui ne peuvent pas être immédiatement arrêté. Dans ce cas, la bonne stratégie pourrait être de dire au programme de sortie après le calcul est terminé. Le code suivant donne un exemple de comment cela peut être mis en œuvre:
La différence entre ce code et le premier exemple est que
e.Cancel
est définie sur true, ce qui signifie que l'exécution se poursuit après le délégué. S'il est exécuté, le programme attend que l'utilisateur appuie sur Ctrl + C. Quand cela arrive, lekeepRunning
variable change de valeur qui provoque la boucle while à la sortie. C'est un moyen de rendre le programme de sortie de douceur.keepRunning
peut-être besoin d'être marquévolatile
. Le thread principal de cache sur un PROCESSEUR inscrire autrement, et ne remarque pas le changement de valeur lorsque le délégué est exécutée.ManualResetEvent
plutôt que de tourner sur unbool
.winpty dotnet run
). Sinon, le délégué ne sera jamais exécuté.Je voudrais ajouter à Jonas répondre. Filer sur un
bool
sera la cause de l'UC à 100%, et un tas de déchets de l'énergie en faisant beaucoup de rien en attendant CTRL+C.La meilleure solution est d'utiliser un
ManualResetEvent
à fait "attendre" pour le CTRL+C:Ici est un exemple de travail. coller dans le vide C# console projet:
Cette question est très similaire à:
La Capture de la sortie de la console en C#
Voici comment j'ai résolu ce problème, et traitées à l'utilisateur de frapper le X et Ctrl-C. Notez l'utilisation de ManualResetEvents. Ces provoquera le thread principal pour dormir, ce qui libère le CPU pour le traitement d'autres threads en attendant la sortie, ou le nettoyage. REMARQUE: Il est nécessaire de définir la TerminationCompletedEvent à la fin de la main. Le manque de faire ainsi, inutile de latence en rupture due à l'OS d'expirer tout en tuant l'application.
Console.TreatControlCAsInput = true;
a travaillé pour moi.