Pergunta

eu tenho um System.Timers.Timer temporizador qual é AutoReset está configurado para false.Eu uso um try/finally para segurar eu Start o cronômetro no final é callback (Eu uso o cronômetro desta forma para evitar a sobreposição de callback execução).Código:

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

Minha pergunta é o que acontece se o thread em execução for Aborted?Será que o finally seção ainda está em execução ou não há thread para executar essa parte?

Foi útil?

Solução

Sim, essa linha sempre será executada e o aborto bloqueado até que o código no finally termina a cláusula.

Outras dicas

A fonte oficial...

Quando uma chamada é feita para o método de aborto para destruir um thread, o tempo de execução do idioma comum lança uma threadabortException.ThreadAbortException é um especial exceção que pode ser pega, mas será automaticamente levantado novamente em o fim do bloco de captura.Quando isso exceção é gerada, o tempo de execução executa todos os blocos finais antes terminando o fio.Porque o fio pode fazer uma computação ilimitada no finalmente bloqueia ou chama Thread.ResetAbort para cancelar a anulação, não há garantia de que o fio nunca vai acabar.Se você quiser esperar até que o fio abortado tenha terminado, você pode chamar o método Thread.Join .Ingressar é uma chamada de bloqueio que não retornar até que o thread realmente pare Execução.

Leia mais sobre isso em MSDN.

Cite o documentação (ênfase minha):

Quando esse método é invocado em um thread, o sistema lança uma ThreadAbortException no thread para anulá-lo.ThreadAbortException é uma exceção especial que pode ser capturada pelo código do aplicativo, mas é lançada novamente no final do bloco catch, a menos que ResetAbort seja chamado.ResetAbort cancela a solicitação de aborto e evita que ThreadAbortException encerre o thread. Blocos finais não executados são executados antes que o thread seja abortado.

Não há garantia de que o thread seja abortado imediatamente ou de todo.Esta situação pode ocorrer se um thread fizer uma quantidade ilimitada de computação nos blocos finalmente que são chamados como parte do procedimento de aborto, atrasando indefinidamente o aborto.Para esperar até que um thread seja abortado, você pode chamar o método Join no thread depois de chamar o método Abort, mas não há garantia de que a espera terminará.

Então a resposta é sim, os blocos finalmente serão executados.

sim o finally sempre será usado, não importa como saia 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.

Leia mais em MSDN.

se o thread já tiver sido abortado, o bloco catch e o bloco final podem continuar a ser executados.

Consulte este link para obter uma imagem clara de como isso é tratado na classe system.threadingAnalisando as profundezas do ThreadAbortException

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top