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?
fonte
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?
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.
Esta pergunta é uma duplicata.
O que há de errado em usar Thread.Abort ()
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.
fonte
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: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.fonte
FileStream.Read()
para um pipe nomeado que atualmente não está recebendo nada (leia os blocos de chamadas enquanto espera pelos dados de entrada) não responderáThread.Abort()
. Ele permanece dentro daRead()
chamada.fonte
E se um thread estiver travando e for interrompido / eliminado? Os recursos permanecem presos
referência MSDN
consulte: Melhores práticas de segmentação gerenciada
fonte
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); }});
fonte
ThreadAborts não ocorrerá dentro de um bloco final ou entre BeginCriticalRegion e EndCriticalRegion
fonte
Porque você pode capturar o
ThreadAbortException
e chamarThread.ResetAbort
dentro do manipulador.fonte
OT: Para uma abordagem abrangente, independente de linguagem, questionavelmente útil e muito engraçada sobre simultaneidade, consulte Verity Stob !
fonte
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.
fonte