Este es un problema curioso.
El código que ha publicado debe funcionar. Parece que hay algún tipo de optimización que decide no llamar a su controlador de captura.
lo tanto, quería para detectar la excepción con esto:
bool threadAborted = true;
try {
try { }
finally { /* critical code */ }
threadAborted = false;
}
finally {
Console.WriteLine("Thread aborted? {0}", threadAborted);
}
Console.WriteLine("Done");
(. Mi código actual simplemente dormía en esa sección de código crítico, por lo que podía estar seguro de que iba a abortar después de que por fin)
Imprimió:
¿Ha abortado el hilo? Falso
¡Hmmm, extraño de hecho!
así que pensé en hacer un poco más trabajo allí, para engañar a las optimizaciones "inteligentes":
bool threadAborted = true;
try {
try { }
finally { /* critical code */ }
threadAborted = AmIEvil();
}
finally {
Console.WriteLine("Thread aborted? {0}", threadAborted);
}
Console.WriteLine("Done");
Dónde AmIEvil
es simplemente:
[MethodImpl(MethodImplOptions.NoInlining)]
static bool AmIEvil() {
return false;
}
Finalmente se imprimen:
¿Hilo abortado? Verdadero
Y ahí lo tienes. Utilizar esto en su código:
try {
try { }
finally { /* critical code */ }
NoOp();
}
catch (Exception ex) {
// ThreadAbortException is caught here now!
}
Dónde NoOp
es simplemente:
[MethodImpl(MethodImplOptions.NoInlining)]
static void NoOp() { }
Finalmente no se salta. La 'ThreadAbortException' estaba esperando ser lanzada hasta _después_ de la' captura 'porque el 'try' estaba en un CER (Región de Ejecución Restringida). La llamada al método lo hace tal que no puede ser un CER. –