Wie kann ich die trap-ctrl-c (SIGINT) in einer C# - Konsolenanwendung
Ich würde gerne in der Lage, trap STRG+C in einer C# - Konsolenanwendung, so dass ich tragen kann, einige Aufräumarbeiten vor dem beenden. Was ist der beste Weg, dies zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Siehe MSDN:
Console.CancelKeyPress Veranstaltung
Artikel mit code-Beispielen:
Strg-C und der .NET-Konsolenanwendung
CancelKeyPress
wird nur kurz erwähnt in den Kommentaren. Einen guten Artikel codeneverwritten.com/2006/10/...Den Console.CancelKeyPress Veranstaltung verwendet. Dies ist, wie es verwendet wird:
Wenn der Benutzer drückt Strg + C den code in die Stellvertretung wird ausgeführt und das Programm beendet. Dadurch können Sie die Bereinigung durchführen durch Aufruf von notwendigen Methoden. Beachten Sie, dass kein code nach der delegate ausgeführt wird.
Gibt es andere Situationen, in denen diese nicht schneiden es. Zum Beispiel, wenn das Programm gerade durchführen, wichtige Berechnungen, die nicht sofort gestoppt werden. In diesem Fall, die richtige Strategie sein könnte, um zu sagen, das Programm zu verlassen, nachdem die Berechnung abgeschlossen ist. Der folgende code gibt ein Beispiel, wie dies umgesetzt werden kann:
Den Unterschied zwischen diesem code und dem ersten Beispiel ist, dass
e.Cancel
ist auf true gesetzt, was bedeutet, dass die Ausführung fortgesetzt wird, nachdem der Stellvertretung. Wenn ausgeführt wird, wartet das Programm auf den Benutzer drücken Sie Strg + C. Wenn das passiert, daskeepRunning
variable den Wert ändert, die bewirkt, dass die while-Schleife zu beenden. Dies ist ein Weg, um das Programm ordnungsgemäß beendet werden.keepRunning
können, müssen gekennzeichnet werdenvolatile
. Der Haupt-thread könnte-cache auf einem CPU-register anders, und nicht merken, dass Sie den Wert ändern, wenn der Delegat ausgeführt wird.ManualResetEvent
eher als Drehung auf einerbool
.winpty dotnet run
). Ansonsten ist die Stellvertretung wird nie ausgeführt werden.Möchte ich hinzufügen Jonas' Antwort. Spinning auf einem
bool
verursachen 100% CPU-Auslastung, und verschwenden jede Menge Energie tun viel nichts während der Wartezeit für STRG+C.Die bessere Lösung ist die Verwendung eines
ManualResetEvent
tatsächlich "warten" für die STRG+C:Hier ein komplettes lauffähiges Beispiel. einfügen in eine leere C# - Konsole-Projekt:
Diese Frage ist sehr ähnlich:
Capture console exit C#
Hier ist, wie ich dieses problem gelöst, und befasste sich mit der Benutzer zu schlagen, die X sowie Strg-C. Beachten Sie die Verwendung von ManualResetEvents. Diese Ursache wird der main-thread schlafen, die befreit die CPU zu verarbeiten, andere threads während der Wartezeit entweder zu beenden, oder zu bereinigen. HINWEIS: Es ist notwendig, um die TerminationCompletedEvent am Ende von main. Nichtbeachtung führt zu einer unnötigen Wartezeit die Kündigung aufgrund der OS-timing aus, während die Tötung der Anwendung.
Console.TreatControlCAsInput = true;
für mich gearbeitet hat.