No MSDN, a descrição do método Thread.Abort () diz: "Chamar esse método geralmente encerra o thread."
Por que não SEMPRE?
Em quais casos ele não encerra o tópico?
Existe alguma outra possibilidade de encerrar tópicos?
No MSDN, a descrição do método Thread.Abort () diz: "Chamar esse método geralmente encerra o thread."
Por que não SEMPRE?
Em quais casos ele não encerra o tópico?
Existe alguma outra possibilidade de encerrar tópicos?
Respostas:
Thread.Abort()
injeta um ThreadAbortException
no segmento. O thread pode cancelar o pedido chamando Thread.ResetAbort()
. Além disso, há certas partes do código, como o finally
bloco que será executado antes que a exceção seja tratada. Se, por algum motivo, o encadeamento estiver preso em tal bloco, a exceção nunca será gerada no encadeamento.
Como o chamador tem muito pouco controle sobre o estado do thread ao chamar Abort()
, geralmente não é aconselhável fazer isso. Em vez disso, passe uma mensagem para o thread solicitando o encerramento.
Em quais casos ele não encerra o tópico?
Esta pergunta é uma duplicata.
O que há de errado em usar Thread.Abort ()
Existe alguma outra possibilidade de encerrar os tópicos?
Sim. O seu problema é que você nunca deve iniciar um tópico que você não pode dizer educadamente para parar, e ele termina em tempo hábil. Se você está em uma situação em que precisa iniciar um tópico que pode ser (1) difícil de interromper, (2) com erros ou pior de tudo (3) hostil para o usuário, a coisa certa a fazer é fazer um novo processo, inicie o thread no novo processo e, em seguida, encerre o processo quando quiser que o thread seja desativado. A única coisa que pode garantir o encerramento seguro de um thread não cooperativo é o sistema operacional interrompendo todo o seu processo.
Veja minha resposta excessivamente longa a esta pergunta para mais detalhes:
Usando a instrução de bloqueio em um loop em C #
A parte relevante é a parte no final em que discuto quais são as considerações sobre quanto tempo você deve esperar até que um thread se mate antes de abortá-lo.
Por que não SEMPRE? Em quais casos ele não termina o segmento?
Para começar, um thread pode capturar a ThreadAbortException
e cancelar seu próprio encerramento. Ou pode realizar um cálculo que leva uma eternidade enquanto você tenta abortá-lo. Por causa disso, o tempo de execução não pode garantir que o encadeamento sempre será encerrado depois que você solicitar.
ThreadAbortException
tem mais:
Quando uma chamada é feita para o método Abort para destruir um thread, o common language runtime lança um ThreadAbortException. ThreadAbortException é uma exceção especial que pode ser detectada, mas será automaticamente gerada novamente no final do bloco catch. Quando essa exceção é levantada, o tempo de execução executa todos os blocos finally antes de encerrar o thread. Uma vez que o encadeamento pode fazer um cálculo ilimitado nos blocos finally, ou chamar
Thread.ResetAbort()
para cancelar o aborto, não há garantia de que o encadeamento acabará.
Você não precisa de Abort()
um thread manualmente. O CLR fará todo o trabalho sujo para você se você simplesmente deixar o método no thread retornar; isso encerrará o tópico normalmente.
E se um thread estiver travando e for interrompido / eliminado? Os recursos permanecem presos
Funciona bem quando um thread chama o aborto, mas não por outro thread. Abortar, encerra à força o encadeamento afetado, mesmo que não tenha concluído sua tarefa e não ofereça oportunidade para a limpeza de recursos
referência MSDN
Não consigo abortar um thread que está preso em um loop:
//immortal
Thread th1 = new Thread(() => { while (true) {}});
No entanto, posso abortar o thread se dormir durante o loop:
//mortal
Thread th2 = new Thread(() => { while (true) { Thread.Sleep(1000); }});
ThreadAborts não ocorrerá dentro de um bloco final ou entre BeginCriticalRegion e EndCriticalRegion
Porque você pode capturar o ThreadAbortException
e chamar Thread.ResetAbort
dentro do manipulador.
OT: Para uma abordagem abrangente, independente de linguagem, questionavelmente útil e muito engraçada sobre simultaneidade, consulte Verity Stob !
Tive casos em que o thread estava muito ocupado para ouvir a chamada Abort (), o que geralmente resulta em uma ThreadAbortingException sendo lançada em meu código.