2012-06-13 19 views
11

Ich verwende einen Thread in C#, wo ich die IsBackground-Eigenschaft auf true festgelegt habe. Der Thread führt Code in einer Schleife aus, bis die Anwendung geschlossen wird. Wenn die Anwendung geschlossen wird, wird der Thread auch nicht mehr ausgeführt (weil ich IsBackground = true gesetzt habe).Kann ich erkennen, wenn ein Hintergrund-Thread von der Anwendung beendet wird, wenn die Anwendung geschlossen wird?

Wie löscht die Anwendung den Thread? Es sieht so aus, als würde es nicht abbrechen, weil ich keine ThreadAbortException erhalte. Passiert es hinter den Kulissen? Ich würde gerne ein Rollback in meinem letzten Block der Schleife machen.

Ich weiß, ich könnte einfach abbrechen auf den Thread selbst, aber ich möchte wissen, wie die Anwendung meinen Hintergrund Thread schließt und wenn ich darauf aus dem Thread reagieren kann. Ich weiß, dass ich das Application.ApplicationExit-Ereignis abonnieren kann, aber ich führe diesen Code sowohl in einem Dienst als auch in einem WinForm aus, und ich würde lieber eine Ausnahme in der Schleife abfangen, damit ich die finally-Anweisung zurücksetzen kann.

+0

Sie könnten es zu einem Vordergrund-Thread machen und ein "globales" Szenario zum Herunterfahren von Anwendungen erstellen, das den Thread manuell schließt. – CodingBarfield

+0

Haben Sie sich das Ereignis [AppDomain.ProcessExit] (http://msdn.microsoft.com/en-us/library/system.appdomain.processexit.aspx) angesehen? – Botz3000

+0

Sie sagen also beide, dass es hinter den Kulissen passiert und ich kann nicht anders reagieren, als diese Art von benutzerdefinierten Lösungen zu erstellen? –

Antwort

5

Es scheint, dass es es nicht tut durch den Aufruf abbrechen, weil ich

Es tut keinen Thread bekommen, hat die CLR zwei Möglichkeiten, einen Thread zu beenden. Der Thread, der über Thread.Abort() aufgerufen wird, kann eine ThreadAbortException sehen. Aber es gibt auch einen unhöflichen Abbruch, der genauso funktioniert. Aber abzüglich der TAE und keine final blocks ausführen. Du kannst es nicht beobachten.

+0

Aha .. Danke für das Aussortieren. Ich konnte keine Dokumentation zu diesem –

+0

finden Ist es ein Fehler auf MSDN? http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx Wenn die Common Language Runtime (CLR) Hintergrundthreads beendet, nachdem alle Vordergrundthreads in einer verwalteten ausführbaren Datei beendet wurden, wird Thread.Abort nicht mehr verwendet. Daher können Sie ThreadAbortException nicht verwenden, um zu erkennen, wenn Hintergrundthreads von der CLR beendet werden. – Eldar

+0

Ich sehe keine Diskrepanz zwischen diesem MSDN-Artikel und dieser Antwort. Unhöfliche Abbrüche können durch Anwendungscode ausgelöst werden, aber Sie benötigen AppDomain.Unload oder Environment.Exit, nicht die Art von Methoden, an die jemand zuerst denkt, um einen Thread abzubrechen :) –

1

Der gestartete thread tritt in den Running-Zustand ein (d. H. Beginnt mit der Ausführung), wenn das Betriebssystem dem thread einen Prozessor zuweist. Wenn ein Started-Thread zum ersten Mal einen Prozessor empfängt und ein Running-Thread wird, führt der Thread seine ThreadStart delegate aus, die die Aktionen angibt, die der Thread während seines Lebenszyklus ausführt. Wenn ein Programm einen neuen Thread erstellt, gibt das Programm die ThreadStart delegate des Threads als Argument für den Thread-Konstruktor an.

Ein laufender Thread tritt in den Status Stopped (or Dead) ein, wenn ThreadStart delegate beendet wird. In deinem Fall endet dein Haupt-Thread. So bleibt Ihr ThreadStart delegate Objekt nicht im Speicher. Wenn keine Verweise auf das Thread-Objekt vorhanden sind, kann der Garbage Collector das Thread-Objekt aus dem Speicher entfernen.

+0

Danke für eine gute Erklärung. Ich endete mit dem Ereignis AppDomain.ProcessExit als Botz3000 vorgeschlagen. Ich kann dann thread.Abort() aufrufen, wenn dieses Ereignis ausgelöst wird. Es scheint gut zu funktionieren. –

+0

Diese Antwort ist falsch. Ein abgebrochener Hintergrund-Thread wird vom GC nicht abgebrochen. Unabhängig davon, welche starken Verweise Sie auf das verwaltete Thread-Objekt haben, wird es durch die Laufzeit zwangsweise abgebrochen. Siehe die Antwort von Hans für die Erklärung. – Josh

+0

@JoshEinstein: Vielleicht hast du recht, aber Hans hat nicht erklärt, wie CLR den Thread abnormal abbricht .... Kannst du das erklären? – Talha

Verwandte Themen