Destruição de segmentos
The Abort método é usado para interromper um thread gerenciado permanentemente. Quando você telefonar Abort, o common linguagem tempo de execução lança um ThreadAbortException no segmento destino, que pode capturar o thread-alvo. Para obter mais informações, consulte Thread.Abort.
Observação: |
---|
Se um segmento está em execução não gerenciado de código quando seu Abort método é chamado, o tempo de execução marca ThreadState.AbortRequested. A exceção é lançada quando o thread retorna ao código gerenciado. |
Depois que um thread é interrompido, ele não pode ser reiniciado.
The Abort método não faz com que o thread interromper imediatamente, porque o thread-alvo pode capturar o ThreadAbortException e executar quantidades arbitrárias de código em um finally bloco. Você pode chamar Thread.Join Se você precisar esperar até que o thread foi finalizada. Thread.Join é uma telefonar de bloqueio que não retorna até que o thread realmente parou de executar ou um intervalo de tempo limite opcional tiver decorrido. O thread anulado poderia chamar o ResetAbort método ou executar o processamento não vinculado em um finally bloquear, portanto, se você não especificar um tempo limite, a espera não é garantida para encerrar.
Segmentos que estão aguardando em uma telefonar para o Thread.Join método pode ser interrompido por outros threads de telefonar Thread.Interrupt.
Tratamento ThreadAbortException
Se você espera que o thread a ser interrompida, ou sistema autônomo resultado da chamada Abort de seu próprio código ou sistema autônomo resultado de descarregar um domínio do aplicativo no qual o thread está em execução)AppDomain.Unload usa Thread.Abort Para terminar threads), o thread deve lidar com o ThreadAbortException e executar qualquer processamento final em um finally cláusula, sistema autônomo mostra o 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.
O código de limpeza deve estar no catch cláusula ou o finally cláusula, porque um ThreadAbortException relançadas pelo sistema no participante do finally cláusula, ou no participante das catch cláusula se não houver nenhum finally cláusula.
Você pode impedir que o sistema de relançamento a exceção, chamando o Thread.ResetAbort método. No entanto, você deve fazer isso somente se o seu próprio código causou o ThreadAbortException.