8 Stimmen

Wie kann ich eine ThreadAbortException in einem finally-Block erkennen? (.NET)

Ich habe einige kritische Logik in einem finally-Block (mit einem leeren try-Block), weil ich garantieren möchte, dass der Code ausgeführt wird, auch wenn der Thread abgebrochen wird. Allerdings möchte ich auch die ThreadAbortException erkennen. Ich habe festgestellt, dass die ThreadAbortException nicht abgefangen wird, wenn ich meinen kritischen try/finally-Block in ein try/catch einpacke. Gibt es eine Möglichkeit, sie zu erkennen?

try {
    try { }
    finally {
        // critical logic
    }
} catch(Exception ex) {
    // ThreadAbortException is not caught here, but exceptions thrown
    // from within the critical logic are
}

0voto

DonkeyMaster Punkte 1262

Ich stimme mit Arul überein. Der Aufruf von Thread.Abort() ist ein Zeichen für schlechtes Design.

Lassen Sie mich Peter Ritchie zitieren aus MSDN: Thread.Abort (Hervorhebung von mir):

Es gibt viele Gründe, Thread.Abort und ThreadAbortException nicht zu verwenden

Auf bestimmten Plattformen (z. B. x64 und IA64) kann der Abbruch vor Monitor.Enter und einem Try-Block auftreten (sogar mit Lock/SyncLock), wodurch der Monitor verwaist. Die ThreadAbortException kann in Code von Drittanbietern auftreten, der nicht für die Behandlung von Thread-Abbrüchen geschrieben wurde. Der Thread kann während der Verarbeitung eines finally-Blocks in .NET 1.x abgebrochen werden Verwendet Ausnahmen für die normale Kontrollflusslogik. Asynchrone Ausnahmen können die Änderung des Shard-Status oder der Ressourcen unterbrechen, so dass sie beschädigt werden.

Für weitere Einzelheiten siehe:
http://msmvps.com/blogs/peterritchie/archive/2007/08/22/thead-abort-is-a-sign-of-a-poorly-designed-program.aspx
http://www.bluebytesoftware.com/blog/2007/01/30/MonitorEnterThreadAbortsAndOrphanedLocks.aspx
http://blogs.msdn.com/ericlippert/archive/2007/08/17/subtleties-of-c-il-codegen.aspx

0voto

Jorge Córdoba Punkte 49057

Haben Sie so etwas schon einmal ausprobiert?

try {
    try { }
    catch (ThreadAbortException)
    {
      ThreadAbortExceptionBool = true;
    }
    finally {
        // critical logic
        if (ThreadAbortExceptionBool)
          // Whatever
    }
} 
catch(Exception ex) {
    // ThreadAbortException is not caught here, but exceptions thrown
    // from within the critical logic are
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X