Kann ich bei der sicher auf IsBackground in Threads, wenn die Anwendung beendet wird?
-
20-09-2019 - |
Frage
Ich bin mit ein paar Hintergrund-Threads in der GUI. Derzeit bin ich die Umsetzung einen persönlichen Thema Stornierung Code, aber es gibt IsBackground Eigenschaft in Threads und nach MSDN sie selbst aufheben werden.
Ich weiß, dass es zu Thread.Abort geht (), die böse ist, aber es gibt nichts in dieser Hintergrund-Threads gehen, dass ich einen ordnungsgemäßen Zustand zu halten brauchen oder erfordert die richtige Reinigung.
Ich versuche, keine Abstürze zu vermeiden, wenn der Benutzer schließt nach unten nur die Anwendung in der Mitte eines Hintergrund-Thread. Da Multi-Threading-Szenarien sehr schwer zu testen sind würde ich Ihre Meinung zu diesem Thema bekommen.
Im Grunde statt meinen eigenen Code des Rollens soll ich nur gesetzt IsBackground = True und vergessen Sie den Rest?
Lösung
Thread.Abort löst eine Ausnahme, also, wenn Ihr Code bereits korrekt schließlich verwenden geschrieben / verwenden, sollte es nicht ordnungsgemäß und lassen Sie alle Ressourcen.
Bearbeiten
Ich sollte wahrscheinlich ein wenig mehr Details geben. Erstens ist die Ausnahme vom Typ Threadabort. Das Interessante daran ist, dass, auch wenn Sie es zu fangen und nichts zu tun, ist es nicht weggehen. Mit anderen Worten, sobald es Ihren Fang Block verlässt, bleibt sie geworfen werden. Dies ist so, dass die (in der Regel schlecht) Praxis der Ausnahme abfangen und es beim Schlucken nicht stoppen den Faden von abgebrochen zu werden. Wenn Sie das tun wollen, tatsächlich den Abbruch zu stoppen, müssen Sie die Ausnahme fangen, dann Thread.ResetAbort nennen.
Andere Tipps
Die MSDN-Seite auf dem IsBackground
Eigenschaft lautet:
Ein Gewinde ist entweder ein Hintergrund-Thread oder ein Vordergrundgewinde. Hintergrund Gewinde sind identisch Vordergrund Fäden, mit der Ausnahme, dass Hintergrund Fäden nicht verhindern, ein Verfahren aus endet. Sobald alle Vordergrund Threads zu einem Prozess gehören, beendet, die gemeinsame Sprache Laufzeit endet der Prozess. Irgendein Hintergrund verbleibenden Threads gestoppt und nicht abgeschlossen.
So wäre es mir bedeutet, dass Sie Ihren Thread machen müßten ziemlich defensiv, um sicherzustellen, dass es nicht verlassen hat alle Verbindungen öffnen, Datenbanken Hälfte geschrieben usw. Alles, was entscheidend brauchen würde in einem Vordergrund Thread zu sein, die verhindern würden, Schließen der Anwendung, bis es abgeschlossen.
Jonathan Greensted der Post eine gute Zusammenfassung hat über IsBackground
:
Die IsBackground Eigenschaft ermöglicht es Ihnen der Laufzeit zu sagen, ob der Faden a Vordergrund (UI) Gewinde oder ein Hintergrund Faden. Standardmäßig werden alle Threads als Vordergrund Threads erstellt, es sei denn Sie ändern diese Eigenschaft.
Warum kümmern wir uns?
Nun, die .NET-Laufzeit etwas tut Besonderes, wenn der letzte Vordergrund Thread beendet wird - es bricht alle The Hintergrund-Threads und beendet die Anwendung. (Wir wissen Thread.Abort ist schlecht aber wenn die Anwendung wobei Abschaltung trotzdem, dass badness hat eine sehr begrenzte Dauer.)
Um es anders auszudrücken, ist die Arbeit in den Hintergrund-Thread ok getan an einem beliebigen Punkt gestoppt werden, wenn die Anwendung geschlossen wird?
Wenn nicht, dann sollte es wohl ein Vordergrundthread sein -. So ein Thread die Arbeit mit Datei-Handles oder das Öffnen von Datenbankverbindungen ideal Vordergrund sein sollte, wo eine Anwendung beenden wird für diesen Thread zu beenden warten, bevor quiting
ich denke, das auf die Ressource abhängt. Zum Beispiel wird, wenn Buchse sicher Prozess Enden geschlossen. Für einige Ressource sollten Sie besser loslassen, bevor der Thread beenden.