asynchronousThreadAbort MDA
O asynchronousThreadAbort Assistente de depuração gerenciada (MDA) é ativado quando um thread tenta introduzir uma anulação assíncrona em outro segmento. Anulações de thread síncrona não ativar o asynchronousThreadAbort MDA.
Sintomas
Falha de um aplicativo com um sem tratamento ThreadAbortException quando o thread do aplicativo principal é abortado. Se o aplicativo continuar a execução, as conseqüências podem ser piores do que o aplicativo falhando, possivelmente resultando em ainda mais a corrupção de dados.
As operações devem ser atômica provavelmente tem sido interrompidas após a conclusão parcial, deixando os dados de aplicativo em um estado imprevisível. A ThreadAbortException pode ser gerado a partir de pontos aparentemente aleatórios na execução do código, geralmente em lugares em que uma exceção não é esperada que surjam. O código pode não ser capaz de lidar com tal exceção, resultando em um estado corrompido.
Sintomas podem variar amplamente, devido à aleatoriedade inerente ao problema.
Causa
O código em um thread de chamada a Thread.Abort método em um segmento de destino para apresentar uma anulação de thread assíncrona. Anulação de thread é assíncrona porque o código que faz a chamada para Abort está sendo executado em um thread diferente do destino da operação de anulação. Anulações de thread síncrona não devem causar um problema porque o thread executar o Abort deve ter feito para que somente em um ponto de verificação de seguro onde o estado do aplicativo é consistente.
Anulações de thread assíncronas apresentam um problema porque eles são processados em momentos imprevisíveis na execução do thread-alvo. Para evitar isso, o código escrito para execução em um thread que pode ser anulado dessa maneira precisaria lidar com um ThreadAbortException em quase todas as linhas de código, tomando cuidado para colocar dados do aplicativo volta para 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 uma dessas categorias.
A causa pode ser difícil determinar devido à aleatoriedade inerente ao problema.
Resolução
Evite o design de código que requer o uso de anulações de thread assíncronas. Há várias abordagens mais apropriado para a interrupção de um thread de destino que não exigem uma chamada para Abort. O mais seguro é apresentar um mecanismo, como, por exemplo, 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 de seguros. Se ele perceber que 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. Ela somente reporta dados sobre anulações de thread assíncronas.
Saída
O MDA relata a identificação do segmento que está realizando a anulação e a identificação do segmento que é o destino da abortar. Eles nunca será o mesmo porque isso está limitado a anulações assíncronas.
Configuração
<mdaConfig>
<assistants>
<asynchronousThreadAbort />
</assistants>
</mdaConfig>
Exemplo
Ativando o asynchronousThreadAbort MDA requer apenas uma chamada de Abort em um thread separado em execução. Considere as conseqüências se o conteúdo do thread Iniciar função eram um conjunto de operações mais complexas, que pode ser interrompido em qualquer ponto arbitrário pela abortar.
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();
}