dangerousThreadingAPI MDA

O dangerousThreadingAPI Assistente de depuração gerenciada (MDA) é ativado quando o Thread.Suspend método for chamado em um thread diferente do thread atual.

Sintomas

Um aplicativo não está respondendo ou trava indefinidamente. Dados do sistema ou aplicativo podem ser deixados em um estado de imprevisível temporariamente ou mesmo depois que um aplicativo foi desligado. Algumas operações não forem concluídas conforme esperado.

Sintomas podem variar amplamente, devido à aleatoriedade inerente ao problema.

Causa

Uma thread estiver suspensa de forma assíncrona usando outro thread o Suspend método. Não há nenhuma maneira de determinar quando é seguro para suspender outro thread que pode ser no meio de uma operação. Suspender o thread pode resultar em corrupção de dados ou a quebra de constantes. Um segmento deve ser colocado em um estado suspenso e usando nunca reiniciado o Resume método, o aplicativo pode travar indefinidamente e possivelmente danificar dados do aplicativo. Esses métodos foram marcados como obsoletos.

Se os primitivos de sincronização são mantidos por thread-alvo, eles permanecem mantidos durante a suspensão. Isso pode levar a travamentos deve outro thread, por exemplo, a realização de thread a Suspend, a tentativa de adquirir um bloqueio no primitivo. Nessa situação, o problema se manifesta como um deadlock.

Resolução

Evite designs que exigem o uso de Suspend e Resume. Para a cooperação entre threads, usar primitivos de sincronização, como Monitor, ReaderWriterLock, Mutex, ou C# lockinstrução. Se você deve usar esses métodos, reduzir a janela de tempo e minimizar a quantidade de código que é executado enquanto o thread está em um estado suspenso.

Efeito sobre o tempo de execução.

Este MDA não tem efeito sobre o CLR. Ela somente reporta dados sobre as operações de segmentação perigosas.

Saída

O MDA identifica o método de segmentação perigoso que fez com que ele seja ativado.

Configuração

<mdaConfig>
  <assistants>
    <dangerousThreadingAPI />
  </assistants>
</mdaConfig>

Exemplo

O exemplo de código a seguir demonstra uma chamada para o Suspend método faz com que a ativação da dangerousThreadingAPI.

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

Consulte também

Referência

Thread

<>bloqueio de>instrução (referência de TRANSLATION FROM VPE FOR CSHARP)

Conceitos

Diagnosticar erros com assistentes de depuração gerenciada