Frage

Ich habe eine System.Timers.Timer timer, der es ist AutoReset ist eingestellt auf false.Ich benutze ein try/finally um mich zu versichern Start der Timer am Ende davon ist callback (Ich benutze den Timer auf diese Weise, um Überlappungen von zu verhindern.) callback Ausführung).Codes:

// inside timer call back
try
{
    // Do something
}
finally
{
    timer.Start(); // Is this line always executed?
}

Meine Frage ist, was passiert, wenn der ausführende Thread ist Aborted?Hat der finally abschnitt wird noch ausgeführt oder es gibt keinen Thread, um diesen Teil auszuführen?

War es hilfreich?

Lösung

Ja, diese Zeile wird immer ausgeführt und der Abbruch blockiert, bis der Code in der finally klausel endet.

Andere Tipps

Die offizielle Quelle...

Wenn ein Aufruf zum Abbruch erfolgt methode, um einen Thread zu zerstören, die gemeinsame sprachlaufzeit wirft ein ThreadAbortException.ThreadAbortException ist eine spezielle ausnahme, die abgefangen werden kann, aber es wird automatisch wieder erhöht bei das Ende des Fangblocks.Wenn dies ausnahme ausgelöst wird, wird die Laufzeit führt alle finally Blöcke vorher aus den Thread beenden.Weil der Faden kann eine unbegrenzte Berechnung in der schließlich blockiert oder anruft Thread.ResetAbort, um den Abbruch abzubrechen, es gibt keine Garantie dafür, dass der Thread wird jemals enden.Wenn du warten willst bis der abgebrochene Thread beendet ist, sie können den Thread aufrufen.Join-Methode.Beitreten ist ein blockierender Anruf, der nicht funktioniert kehren Sie zurück, bis der Thread tatsächlich stoppt Vollstreckungsstaat.

Lesen Sie mehr darüber auf MSDN.

Sagte der Dokumentation (empahsis meine):

Wenn diese Methode in einem Thread aufgerufen wird, löst das System eine ThreadAbortException im Thread aus, um sie abzubrechen.ThreadAbortException ist eine spezielle Ausnahme, die vom Anwendungscode abgefangen werden kann, aber am Ende des catch-Blocks erneut ausgelöst wird, sofern nicht ResetAbort aufgerufen wird.ResetAbort bricht die Anforderung zum Abbrechen ab und verhindert, dass die ThreadAbortException den Thread beendet. Nicht ausgeführte Finally-Blöcke werden ausgeführt, bevor der Thread abgebrochen wird.

Es ist nicht garantiert, dass der Thread sofort oder überhaupt abgebrochen wird.Diese Situation kann auftreten, wenn ein Thread eine ausführt unbegrenzter Rechenaufwand in den finally-Blöcken, die als Teil der Abbruchprozedur aufgerufen werden, wodurch der Abbruch auf unbestimmte Zeit verzögert wird.Um zu warten, bis ein Thread abgebrochen wurde, können Sie die Join-Methode für den Thread aufrufen, nachdem Sie die Abbruchmethode aufgerufen haben.

Die Antwort lautet also ja, die finally Blöcke werden ausgeführt.

Ja, das finally wird immer verwendet, egal wie es beendet wird try,

 Whereas catch is used to handle exceptions that occur in a statement block, 
 finally is used to guarantee a statement block of code executes regardless 
 of how the preceding try block is exited.

Lesen Sie mehr auf MSDN.

wenn der Thread bereits abgebrochen wurde, können der catch-Block und der finally-Block weiterhin ausgeführt werden.

Bitte lesen Sie diesen Link, um ein klares Bild davon zu erhalten, wie es im System gehandhabt wird.einfädelklasse Die Tiefen der ThreadAbortException ausloten

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