Compartilhar via


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.

Consulte também

Referência

ThreadAbortException

Thread

Outros recursos

Usando segmentos e Threading