¿ThreadAbortException todavía hacer cumplir ejecutar el código en el último (try/catch) sección?

StackOverflow https://stackoverflow.com/questions/6099382

Pregunta

Tengo un System.Timers.Timer temporizador de que es AutoReset se establece en false.Yo uso un try/finally para asegurarse de que yo Start el temporizador al final de es callback (Yo use el temporizador para de esta manera evitar la superposición de callback la ejecución).Código:

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

Mi pregunta es ¿qué pasa si el subproceso en ejecución es Aborted?¿El finally sección todavía ejecutados o que no hay hilo para ejecutar esa parte?

¿Fue útil?

Solución

Sí, esa línea siempre se ejecutará y el aborto se bloqueará hasta que el código en el finally termina la cláusula.

Otros consejos

La fuente oficial...

Cuando se realiza una llamada a la Anulación método para destruir un hilo común, el language runtime produce una ThreadAbortException.ThreadAbortException es un especial excepción que puede ser capturado, pero automáticamente se vuelve a plantear en el final del bloque catch.Cuando este la excepción es elevado, el tiempo de ejecución ejecuta todos los bloques finally antes de terminando el hilo.Porque el hilo puede hacer un cálculo ilimitado en el finalmente bloques o llamar Subproceso.ResetAbort para cancelar la anulación, no hay ninguna garantía de que el hilo nunca terminará.Si quieres esperar hasta el abortado hilo ha terminado, usted puede llamar a la Rosca.Método de combinación.Unir es una llamada de bloqueo que no regresar hasta que el hilo se detiene de la ejecución.

Leer más sobre ella en MSDN.

dijo el documentación (énfasis mío):

Cuando se invoca este método en un subproceso, el sistema genera una ThreadAbortException en el subproceso para abortarlo.ThreadAbortException es una excepción especial que puede ser detectada por el código de la aplicación, pero se vuelve a generar al final del bloque catch a menos que se llame a ResetAbort.ResetAbort cancela la solicitud de cancelación y evita que ThreadAbortException finalice el hilo. Los bloques finalmente no ejecutados se ejecutan antes de que se cancele el hilo.

No se garantiza que el hilo se cancele inmediatamente o que se cancele en absoluto.Esta situación puede ocurrir si un hilo hace un Cantidad ilimitada de cálculo en los bloques finalmente que se llaman como parte del procedimiento de cancelación., retrasando así indefinidamente el aborto.Para esperar hasta que un hilo haya abortado, puede llamar al método Join en el hilo después de llamar al método Abort, pero no hay garantía de que la espera termine.

Entonces la respuesta es sí, se ejecutarán los bloques finalmente.

sí el finally siempre se utilizará sin importar cómo salga de 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.

Lea más en MSDN.

si el hilo ya ha sido abortado, el bloque catch y el bloque finalmente pueden continuar ejecutándose.

Consulte este enlace para obtener una idea clara de cómo se maneja en la clase system.threading.Sondeando las profundidades de ThreadAbortException

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top