Partilhar via


asynchronousThreadAbort MDA

The asynchronousThreadAbort Assistente de depuração gerenciada (MDA) é ativado quando um thread tenta introduzir uma anulação assíncrono em outro thread. Anulações de thread síncrono não ativar o asynchronousThreadAbort MDA.

Sintomas

Um aplicativo falha com um sem tratamentoThreadAbortException Quando o thread principal do aplicativo foi interrompido. Se o aplicativo continuar executar, as conseqüências podem ser piores do que o aplicativo falhar, possivelmente resultando em corrupção de dados ainda mais.

As operações devem ser atômica provavelmente tem sido interrompidas após a conclusão parcial, deixando aplicativo dados em um estado imprevisível.A ThreadAbortException podem ser gerados de pontos aparentemente aleatórios na execução do código, geralmente em locais em que uma exceção não se espera surgem. O código pode não ser capaz de lidar com tal exceção, resultando em um estado corrompido.

Sintomas podem variar amplamente de devido a aleatoriedade inerente do problema.

Causa

Código em um thread de chamada a Thread.Abort método em um thread de destino para apresentar uma anulação de thread assíncrono. Anulação de thread é assíncrono porque o código que faz a telefonar para Abort é executado em um thread diferente do destino da operação anulação. Anulações de thread síncrono não devem causar um problema porque o thread executar o Abort deve concluído para que somente em um ponto de verificação de seguro onde o estado do aplicativo é consistente.

Anulações de thread assíncrono representar um problema porque eles são processados em pontos imprevisíveis a destino de execução do segmento.Para evitar isso, código escrito para ser executado em um segmento que pode ser anulado dessa maneira precisa manipular um ThreadAbortException em quase todas as linhas do código, tomando cuidado para colocar dados de aplicativos novamente em um estado consistente. Não é realista esperar que o código a ser gravado com esse problema, lembre-se ou escrever código que protege contra todas as circunstâncias possíveis.

Chamadas para código não gerenciado e finally blocos serão não anulados assincronamente mas imediatamente ao sair de um dessas categorias.

A causa pode ser difícil determinar devido à aleatoriedade inerente do problema.

Resolução

Evite o design de código que requer o uso de anulações de thread assíncrono.Há várias abordagens mais apropriada para interrupção de um thread de destino que não exigem uma telefonar para Abort. O mais seguro é apresentar um mecanismo, sistema autônomo uma propriedade comum, que sinaliza o thread-alvo para solicitar uma interrupção.O thread de destino verifica o sinal em determinados pontos de verificação seguros.Se ele perceber uma interrupção foi solicitada, ele pode desligar normalmente.

Efeito sobre o tempo de execução

Este MDA não tem efeito sobre o CLR.Ele só reporta dados sobre anulações de thread assíncrono.

Saída

O MDA relata a ID do thread executando a anulação e a ID do segmento que é o destino da anular.Eles nunca será o mesmo porque isso está limitado a anulações assíncrono.

Configuração

<mdaConfig>
  <assistants>
    <asynchronousThreadAbort />
  </assistants>
</mdaConfig>

Exemplo

Ativando o asynchronousThreadAbort MDA requer apenas uma telefonar de Abort em um thread separado em execução. Considere as conseqüências se o Sumário do thread Iniciar função eram um conjunto de operações mais complexas que pode ser interrompido a qualquer momento arbitrário pela anulação.

using System.Threading;
void FireMda()
{
    Thread t = new Thread(delegate() { Thread.Sleep(1000); });
    t.Start();
    // The following line activates the MDA.
    t.Abort(); 
    t.Join();
}

Consulte também

Conceitos

Diagnosticar erros com assistentes de depuração gerenciadas

Referência

Thread