Partilhar via


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.

Consulte também