Partilhar via


dangerousThreadingAPI MDA

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

Sintomas

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

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

Causa

Um thread está suspensa assincronamente por outro segmento usando o Suspend método. Não é possível para determinar quando é seguro suspender outro thread que pode ser no meio de uma operação.Suspender o thread pode resultar em corrupção de dados ou quebra de constantes.Um segmento deve ser colocado em um estado suspenso e nunca reiniciado usando o Resume método, o aplicativo pode parar indefinidamente e possivelmente danificar dados do aplicativo. Esses métodos foram marcados sistema autônomo obsoleto.

Se os primitivos de sincronização são mantidos por thread-alvo, eles permanecerão mantidos durante a suspensão.Isso pode levar a travamentos deve outro thread, por exemplo o thread executar o Suspend, tentam adquirir um bloquear no primitivo. Nessa situação, o problema se manifesta sistema autônomo um deadlock.

Resolução

Evite designs que exigem o uso de Suspend e Resume. Cooperação entre threads, usar primitivos de sincronização, sistema autônomo Monitor, ReaderWriterLock, Mutex, ou o translation from VPE for Csharp lockdemonstrativo. Se você deve usar esses métodos, reduzir a janela de time 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.Ele só reporta dados sobre as operações de segmentação perigosas.

Saída

O MDA identifica o método threading perigoso que provocou sua seja ativado.

Configuração

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

Exemplo

O exemplo de código a seguir demonstra uma telefonar para o Suspend método faz com que a ativação das 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

Conceitos

Diagnosticar erros com assistentes de depuração gerenciadas

Referência

Thread

bloquear instrução (Referência C#)