Share via


MDA dangerousThreadingAPI

O MDA (assistente para depuração gerenciada) dangerousThreadingAPI é ativado quando o método Thread.Suspend é chamado em um thread que não seja o thread atual.

Sintomas

Um aplicativo está sem resposta. Os dados do sistema ou do aplicativo podem ser deixados em um estado imprevisível temporariamente ou mesmo depois que um aplicativo foi desligado. Algumas operações não são concluídas como esperado.

Os sintomas podem variar muito devido à aleatoriedade inerente ao problema.

Causa

Um thread é suspenso de forma assíncrona por outro thread usando o método Suspend. Não há nenhuma maneira de determinar quando é seguro suspender outro thread que pode estar no meio de uma operação. A suspensão do thread pode resultar na corrupção de dados ou na interrupção de invariáveis. Caso um thread precise ser colocado em um estado suspenso e nunca ser retomado usando o método Resume, o aplicativo poderá parar de responder e, possivelmente, danificar os dados do aplicativo. Esses métodos foram marcados como obsoletos.

Se os primitivos de sincronização forem mantidos pelo thread de destino, eles permanecerão mantidos durante a suspensão. Isso pode levar a deadlocks, caso outro thread, por exemplo, o thread que executa o Suspend, tente 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 cooperação entre threads, use primitivas de sincronização, como Lock, Monitor, ReaderWriterLock, Mutexou a instrução C# lock . Se você precisar usar esses métodos, reduza a janela de tempo e minimize a quantidade de código que é executada enquanto o thread está em um estado suspenso.

Efeito sobre o runtime

Esse MDA não tem efeito sobre o CLR. Ele relata apenas os dados sobre operações de threading perigosas.

Saída

O MDA identifica o método de threading perigoso que fez com que ele fosse ativado.

Configuração

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

Exemplo

O exemplo de código a seguir demonstra uma chamada ao método Suspend que causa 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();  
}  

Confira também