Destrua fios
Para encerrar a execução do thread, você geralmente usa o modelo de cancelamento cooperativo. No entanto, às vezes não é possível parar um thread cooperativamente, porque ele executa código de terceiros não projetado para cancelamento cooperativo. Em aplicativos .NET Framework, você pode usar o Thread.Abort método para encerrar um thread gerenciado forçosamente. Quando você chama Aborto , o Common Language Runtime lança um ThreadAbortException no thread de destino, que o thread de destino pode capturar. (No entanto, o tempo de execução do .NET Framework sempre relança automaticamente a exceção após o catch
bloqueio.) Para obter mais informações, consulte Thread.Abort.
O Thread.Abort método não é suportado no .NET 5 (incluindo o .NET Core) e versões posteriores. Se você precisar encerrar a execução de código de terceiros forçosamente no .NET 5+, execute-o no processo separado e use Process.Kill.
Nota
- Quando você chama Thread.Abort para anular um thread diferente do thread atual, você não sabe qual código foi executado ou falhou em executar quando o ThreadAbortException é lançado. Você também não pode ter certeza do estado do seu aplicativo ou de qualquer aplicativo e estado do usuário que ele é responsável pela preservação. Por exemplo, a chamada Thread.Abort pode impedir a execução de construtores estáticos ou a liberação de recursos gerenciados ou não gerenciados.
- Se um thread estiver executando código não gerenciado quando seu Abort método for chamado, o tempo de execução o marcará ThreadState.AbortRequested. A exceção é lançada quando o thread retorna ao código gerenciado.
Depois que um thread é abortado, ele não pode ser reiniciado.
O Abort método não faz com que o thread aborte imediatamente, porque o thread de destino pode capturar e ThreadAbortException executar quantidades arbitrárias de código em um finally
bloco. Você pode ligar Thread.Join se precisar esperar até que o thread tenha terminado. Thread.Join é uma chamada de bloqueio que não retorna até que o thread tenha realmente parado de ser executado ou um intervalo de tempo limite opcional tenha decorrido. O thread abortado pode chamar o ResetAbort método ou executar processamento ilimitado em um finally
bloco, portanto, se você não especificar um tempo limite, não é garantido que a espera termine.
Os threads que estão aguardando uma chamada para o Thread.Join método podem ser interrompidos por outros threads que chamam Thread.Interrupt.
Manipulando ThreadAbortException
Se você espera que seu thread seja abortado, seja como resultado de chamada Abort de seu próprio código ou como resultado do descarregamento de um domínio de aplicativo no qual o thread está sendo executado (AppDomain.Unload uses Thread.Abort para encerrar threads), seu thread deve manipular e ThreadAbortException executar qualquer processamento final em uma finally
cláusula, conforme mostrado no código a seguir.
Try
' Code that is executing when the thread is aborted.
Catch ex As ThreadAbortException
' Clean-up code can go here.
' If there is no Finally clause, ThreadAbortException is
' re-thrown by the system at the end of the Catch clause.
Finally
' Clean-up code can go here.
End Try
' Do not put clean-up code here, because the exception
' is rethrown at the end of the Finally clause.
try
{
// Code that is executing when the thread is aborted.
}
catch (ThreadAbortException ex)
{
// Clean-up code can go here.
// If there is no Finally clause, ThreadAbortException is
// re-thrown by the system at the end of the Catch clause.
}
// Do not put clean-up code here, because the exception
// is rethrown at the end of the Finally clause.
Seu código de limpeza deve estar na catch
cláusula ou na finally
cláusula, porque a ThreadAbortException é relançado pelo sistema no final da finally
cláusula, ou no final da catch
cláusula se não finally
houver cláusula.
Você pode impedir que o sistema lance novamente a exceção chamando o Thread.ResetAbort método. No entanto, você deve fazer isso somente se seu próprio código causou o ThreadAbortException.