Thread.Abort()
spritzt ein ThreadAbortException
auf den Faden. Der Thread kann die Anforderung durch Aufrufen abbrechen Thread.ResetAbort()
. Es gibt auch bestimmte Codeteile, wie zfinally
Block, der ausgeführt wird, bevor die Ausnahme behandelt wird. Wenn der Thread aus irgendeinem Grund in einem solchen Block steckt, wird die Ausnahme für den Thread niemals ausgelöst.
Da der Aufrufer beim Aufrufen nur sehr wenig Kontrolle über den Status des Threads hat Abort()
, ist dies im Allgemeinen nicht ratsam. Übergeben Sie stattdessen eine Nachricht an den Thread, in der Sie die Beendigung anfordern.
Diese Frage ist ein Duplikat.
Was ist falsch an der Verwendung von Thread.Abort ()
Ja. Ihr Problem ist, dass Sie niemals einen Thread starten sollten, von dem Sie nicht höflich sagen können, dass er aufhören soll, und er stoppt rechtzeitig. Wenn Sie sich in einer Situation befinden, in der Sie einen Thread starten müssen, der (1) schwer zu stoppen, (2) fehlerhaft oder am schlimmsten (3) benutzerfeindlich ist, ist es das Richtige, ihn zu erstellen Starten Sie in einem neuen Prozess den Thread im neuen Prozess und beenden Sie den Prozess, wenn der Thread ausfallen soll. Das einzige, was die sichere Beendigung eines nicht kooperativen Threads gewährleisten kann, ist, dass das Betriebssystem seinen gesamten Prozess herunterfährt.
Weitere Einzelheiten finden Sie in meiner übermäßig langen Antwort auf diese Frage:
Verwenden der lock-Anweisung innerhalb einer Schleife in C #
Das relevante Bit ist das Bit am Ende, in dem ich die Überlegungen dazu diskutiere, wie lange Sie warten sollten, bis sich ein Thread selbst beendet, bevor Sie ihn abbrechen.
quelle
Für den Anfang kann ein Thread eine fangen
ThreadAbortException
und seine eigene Beendigung abbrechen. Oder es könnte eine Berechnung durchführen, die ewig dauert, während Sie versuchen, sie abzubrechen. Aus diesem Grund kann die Laufzeit nicht garantieren, dass der Thread immer beendet wird, nachdem Sie ihn dazu aufgefordert haben.ThreadAbortException
hat mehr:Das musst du nicht
Abort()
Thread manuell erstellen. Die CLR erledigt die gesamte Drecksarbeit für Sie, wenn Sie die Methode im Thread einfach zurückgeben. Dadurch wird der Thread normal beendet.quelle
FileStream.Read()
auf eine Named Pipe, die derzeit nichts empfängt (Anrufblöcke lesen, während auf eingehende Daten gewartet wird), wird nicht reagiertThread.Abort()
. Es bleibt imRead()
Anruf.quelle
Was ist, wenn ein Thread eine Sperre hält und abgebrochen / getötet wird? Ressourcen bleiben stecken
Referenz MSDN
Siehe: Best Practices für verwaltetes Threading
quelle
Ich kann einen Thread, der in einer Schleife steckt, nicht abbrechen:
Ich kann den Thread jedoch abbrechen, wenn er während der Schleife schläft:
quelle
ThreadAborts treten nicht innerhalb eines finally-Blocks oder zwischen BeginCriticalRegion und EndCriticalRegion auf
quelle
Weil Sie das fangen
ThreadAbortException
undThread.ResetAbort
im Handler anrufen können .quelle
OT: Für eine umfassende, sprachunabhängige, fragwürdig nützliche und verdammt lustige Darstellung der Parallelität siehe Verity Stob !
quelle
Ich hatte Fälle, in denen der Thread zu beschäftigt war, um den Abort () -Aufruf zu hören, was normalerweise dazu führt, dass eine ThreadAbortingException in meinen Code ausgelöst wird.
quelle