Dies ist ein merkwürdiges Problem.
Der von Ihnen gepostete Code sollte arbeiten. Es scheint, dass eine Art Optimierung im Gange ist, die beschließt, Ihren Catch-Handler nicht aufzurufen.
Ich wollte damit die Ausnahme aufdecken:
bool threadAborted = true;
try {
try { }
finally { /* critical code */ }
threadAborted = false;
}
finally {
Console.WriteLine("Thread aborted? {0}", threadAborted);
}
Console.WriteLine("Done");
(Mein eigentlicher Code schlief einfach in diesem kritischen Codeabschnitt, so dass ich sicher sein konnte, dass er danach endlich abbricht).
Es wurde gedruckt:
Thema abgebrochen? Falsch
Hmmm, in der Tat seltsam!
Also habe ich mir überlegt, dort noch etwas mehr Arbeit zu leisten, um irgendwelche "intelligenten" Optimierungen auszutricksen:
bool threadAborted = true;
try {
try { }
finally { /* critical code */ }
threadAborted = AmIEvil();
}
finally {
Console.WriteLine("Thread aborted? {0}", threadAborted);
}
Console.WriteLine("Done");
Wo AmIEvil
ist gerecht:
[MethodImpl(MethodImplOptions.NoInlining)]
static bool AmIEvil() {
return false;
}
Schließlich wurde er gedruckt:
Thema abgebrochen? Wahr
Und da haben Sie es. Verwenden Sie dies in Ihrem Code:
try {
try { }
finally { /* critical code */ }
NoOp();
}
catch (Exception ex) {
// ThreadAbortException is caught here now!
}
Wo NoOp
ist gerecht:
[MethodImpl(MethodImplOptions.NoInlining)]
static void NoOp() { }