Destruição de segmentos
O Abort método é usado para interromper um thread gerenciado permanentemente. Quando você chamar Abort, o common language runtime lança um ThreadAbortException no thread de destino, o thread-alvo pode interceptar. Para obter mais informações, consulte Thread.Abort.
Observação
Se um segmento em execução não gerenciado de código quando seu Abort método é chamado, o runtime marca ThreadState.AbortRequested.A exceção é lançada quando o thread retorna para o código gerenciado.
Depois que um thread for anulado, ele não pode ser reiniciado.
O Abort método não faz com que o segmento anular imediatamente, porque o thread-alvo pode capturar a ThreadAbortException e executar quantidades arbitrárias de código em um finally bloco. Você pode chamar Thread.Join se você precisa esperar até que o segmento terminou. Thread.Joiné uma chamada de bloqueio que não retorna até que o segmento realmente parou de execução ou um intervalo de tempo limite opcional. O thread anulado poderia chamar o ResetAbort método ou executar processamento acoplado em um finally Bloquear, portanto, se você não especificar um tempo limite, a espera não é garantida para o final.
Segmentos que estão aguardando em uma chamada para o Thread.Join método pode ser interrompido por outros threads que chamam Thread.Interrupt.
Tratamento ThreadAbortException
Se você espera que o thread de ser interrompida, ou como resultado da chamada Abort de seu próprio código ou como resultado de descarregar um domínio de aplicativo no qual o thread está sendo executado (AppDomain.Unload usa Thread.Abort a finalização de segmentos), o thread deve lidar com o ThreadAbortException e realizar o processamento final em um 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 no catch cláusula ou o finally cláusula, porque um ThreadAbortException será emitida novamente pelo sistema no final da finally cláusula, ou no final da catch cláusula se não houver nenhum finally cláusula.
Você pode impedir o sistema relançamento de exceção, chamando o Thread.ResetAbort método. No entanto, você deve fazer este somente se seu próprio código que causou a ThreadAbortException.