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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top