Ich habe eine Konsolenanwendung, die ziemlich viele Threads enthält. Es gibt Threads, die bestimmte Bedingungen überwachen und das Programm beenden, wenn sie wahr sind. Diese Kündigung kann jederzeit erfolgen.
Ich benötige ein Ereignis, das beim Schließen des Programms ausgelöst werden kann, damit ich alle anderen Threads bereinigen und alle Dateihandles und Verbindungen ordnungsgemäß schließen kann. Ich bin mir nicht sicher, ob bereits eines in das .NET Framework integriert ist, daher frage ich, bevor ich mein eigenes schreibe.
Ich habe mich gefragt, ob es ein Ereignis in der Art von:
MyConsoleProgram.OnExit += CleanupBeforeExit;
Antworten:
Ich bin nicht sicher, wo ich den Code im Web gefunden habe, aber ich habe ihn jetzt in einem meiner alten Projekte gefunden. Auf diese Weise können Sie Bereinigungscode in Ihrer Konsole ausführen, z. B. wenn diese abrupt geschlossen wird oder aufgrund eines Herunterfahrens ...
Aktualisieren
Für diejenigen, die die Kommentare nicht überprüfen, scheint es, dass diese spezielle Lösung unter Windows 7 nicht gut (oder überhaupt nicht) funktioniert . Der folgende Thread spricht darüber
quelle
bool Handler()
mussreturn false;
(es gibt nichts im Code zurück), damit es funktioniert. Wenn true zurückgegeben wird, fordert Windows das Dialogfeld "Prozess jetzt beenden" auf. = DVollständiges Arbeitsbeispiel, funktioniert mit Strg-C, schließt die Fenster mit X und tötet:
quelle
Handler
Ausnahme derreturn true
und einer while-Schleife, um Sekunden zu zählen. Die Anwendung läuft weiterhin auf Strg-C, wird jedoch nach 5 Sekunden geschlossen, wenn sie mit dem X geschlossen wird.Handler
Methode ausgeführt wird {unter Verwendung von Win10, .NET Framework 4.6.1}Überprüfen Sie auch:
quelle
Console.CancelKeyPress
dannProcessExit
Ereignis tatsächlich nach allen angehobenCancelKeyPress
Event - Handler Ausführung.Ich hatte ein ähnliches Problem, nur meine Konsolen-App würde in einer Endlosschleife mit einer vorbeugenden Anweisung in der Mitte ausgeführt. Hier ist meine Lösung:
quelle
Klingt es so, als hätten Sie die Threads, die die Anwendung direkt beenden? Vielleicht ist es besser, wenn ein Thread dem Hauptthread signalisiert, dass die Anwendung beendet werden soll.
Bei Empfang dieses Signals kann der Haupt-Thread die anderen Threads sauber herunterfahren und sich schließlich selbst schließen.
quelle
Die Antwort von ZeroKelvin funktioniert in der Konsolen-App Windows 10 x64, .NET 4.6. Für diejenigen, die sich nicht mit der CtrlType-Enumeration befassen müssen, ist hier eine wirklich einfache Möglichkeit, sich in das Herunterfahren des Frameworks einzubinden:
Die Rückgabe von FALSE vom Handler teilt dem Framework mit, dass das Steuersignal nicht "verarbeitet" wird, und die nächste Handlerfunktion in der Liste der Handler für diesen Prozess wird verwendet. Wenn keiner der Handler TRUE zurückgibt, wird der Standardhandler aufgerufen.
Beachten Sie, dass der Rückruf nicht von Windows aufgerufen wird, wenn der Benutzer eine Abmeldung oder ein Herunterfahren durchführt, sondern sofort beendet wird.
quelle
Es gibt für WinForms Apps;
Versuchen Sie es mit Konsolen-Apps
Ich bin mir jedoch nicht sicher, wann das aufgerufen wird oder ob es innerhalb der aktuellen Domain funktioniert. Ich vermute nicht.
quelle
Visual Studio 2015 + Windows 10
Code:
quelle
Der Link oben erwähnt durch Charle B in Kommentar zu FLQ
Tief im Inneren sagt:
An einigen Stellen im Thread wird empfohlen, ein verstecktes Fenster zu erstellen. Also erstelle ich eine Winform und habe sie im Onload an die Konsole angehängt und das ursprüngliche Main ausgeführt. Und dann funktioniert SetConsoleCtrlHandle einwandfrei (SetConsoleCtrlHandle wird wie von flq vorgeschlagen aufgerufen)
quelle
AllocConsole
wie in Ihrem Beispiel), um einige zusätzliche Informationen anzuzeigen. Das Problem ist, dass die gesamte App (alle Windows) geschlossen wird, wenn der Benutzer im Konsolenfenster auf (X) klickt. DasSetConsoleCtrlHandler
funktioniert, aber die App wird trotzdem angehalten, bevor Code im Handler ausgeführt wird (ich sehe Haltepunkte ausgelöst und sofort stoppt die App).Für alle, die sich für VB.net interessieren. (Ich habe im Internet gesucht und konnte kein Äquivalent dafür finden.) Hier wird es in vb.net übersetzt.
quelle