2010-11-24 17 views
4

Wir haben eine .NET-Konsolenanwendung mit vielen Vordergrund-Threads. Wenn wir den Prozess mit Task-Manager beenden oder killjob, kill von der Befehlszeile in Windows, gibt es eine Möglichkeit, mit der wir die Anwendung (Hinzufügen von Manged-Code innerhalb der .net-Konsole App) ordnungsgemäß herunterfahren, so etwas wie ein Funktion wird aufgerufen sagen TodoBeforeShutdown(), die Objekte, schließt alle offenen Verbindungen, etc.Verwalten Sie eine .NET-App so, dass sie ordnungsgemäß beendet wird, wenn sie beendet/beendet wurde

PS - Ich lese die anderen Threads und sie alle vorgeschlagen, verschiedene Möglichkeiten, um den Prozess zu töten, anstatt meine spezifische Frage, was ist der beste Weg, wie wir einen Beendigungsprozess, innerhalb der .NET verwalteten Code handhaben können.

Vielen Dank im Voraus.

Antwort

8

Leider gibt es kein Ereignis, das Sie behandeln können, wenn ein Prozess beendet wird.
Sie können sich vorstellen, einen Prozess wie die Unterbrechung der Stromversorgung des Computers zu beenden - unabhängig davon, welchen Code Sie beim Herunterfahren des Systems entworfen haben. Wenn der Computer nicht ordnungsgemäß heruntergefahren wird, wird dieser Code nicht ausgeführt .

Wenn Sie einen Prozess mithilfe des Task-Managers beenden, wird die Win32-Funktion TerminateProcess aufgerufen, die den Prozess (einschließlich aller zugehörigen Threads) bedingungslos zum Beenden zwingt. Die Ausführung von alle Threads/Prozesse wird angehalten und alle ausstehenden E/A-Anforderungen werden abgebrochen. Dein Programm ist effektiv tot. Die -Funktion ruft nicht die von der CLR bereitgestellte Abschaltsequenz auf, sodass Ihre verwaltete App nicht einmal eine Idee hatte, dass sie heruntergefahren wurde.

Sie schlagen vor, dass Sie Entsorgung Objekte betroffen sind, wenn Prozess Ihrer Anwendung beendet wird, aber es gibt ein paar Dinge, lohnt sich, hier den Hinweis auf:

  • immer danach streben, die Höhe des Schadens zu minimieren, könnte gemacht werden. Entsorgen Sie Ihre Objekte so früh wie möglich, wann immer Sie damit fertig sind. Warte nicht bis später. Zu jedem Zeitpunkt, wenn der Prozess Ihres Programms beendet wird, sollten Sie nur die minimale Anzahl von Objekten in der Nähe halten, was weniger Möglichkeiten für Lecks übrig lässt.

  • Das Betriebssystem wird im Allgemeinen bereinigen und frei am meisten dieser Ressourcen (d. H. Griffe, etc.) bei der Beendigung.

  • Schließlich sollte es selbstverständlich sein, dass Prozessabbruch auf diese Weise wirklich eine Ausnahmebedingung ist - selbst wenn einige Ressourcen auslaufen, das ist zu erwarten. Sie sollten eine App nicht auf diese Weise herunterfahren, genauso wenig wie Sie die notwendigen Windows-Systemprozesse beenden müssen (obwohl Sie das als Administrator ausführen können).

Wenn dies Ihr regelmäßigen Plan ist Ihre Konsole Anwendung herunterzufahren, Sie einen anderen Plan finden müssen.

+0

+1 für 'Sie müssen einen anderen Plan finden' :) – Aamir

+0

Vielen Dank für Ihre Antwort. Ich möchte darauf hinweisen, dass dies nicht Teil eines Plans ist, sondern eher eine Einschränkung, die wir innerhalb der Batch-Scheduling-Infrastruktur unserer Unternehmen haben, die auf die Art und Weise entstanden ist, wie Linux höflich getötet wird. Dies wurde später auf Windows portiert und sie benutzten Kill. – keepsmilinyaar

+0

@keepsmilinyaar: Interessanterweise ist das "höfliche Töten" ziemlich ungewöhnlich, sogar in der Unix-Welt. Die meisten Unix-basierten Betriebssysteme senden 'SIGKILL' (unbedingte) anstelle von' SIGTERM' (die höfliche Methode), um einen Prozess als Reaktion auf den 'killall'-Befehl zu beenden. –

2

Kurz: Sie können nicht!
Das Töten eines Prozesses ist genau das Gegenteil eines eleganten Beendens.
Wenn Sie Foreground-Threads ausführen, wird durch das Senden eines wm_exit die App nicht heruntergefahren. Da Sie über eine Konsolenanwendung verfügen, können Sie die Konsoleneingabe einfach umleiten, um einen "Exit" an Ihren Prozess zu senden.
Weiter denke ich, dass Sie die App in Service (anstelle einer Konsolenanwendung) ändern könnten, dies würde Ihnen genau das bieten, was Sie suchen -> Schnittstelle für einen genussvollen Exit basierend auf Windows-Build-in-Tools/-Befehlen.

Verwandte Themen