Partilhar via


dangerousThreadingAPI MDA

Nota

Este artigo é específico do .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.

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

Sintomas

Um aplicativo não está respondendo. 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 estão a ser concluídas como esperado.

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

Motivo

Um thread é suspenso assincronamente por outro thread usando o Suspend método. Não há como determinar quando é seguro suspender outro thread que pode estar no meio de uma operação. Suspender o thread pode resultar na corrupção de dados ou na quebra de invariantes. Se um thread for colocado em um estado suspenso e nunca retomado usando o método, o aplicativo pode parar de responder e possivelmente danificar os dados do Resume aplicativo. Estes métodos foram marcados como obsoletos.

Se as primitivas de sincronização forem mantidas pelo thread de destino, elas permanecerão mantidas durante a suspensão. Isso pode levar a impasses caso outro thread, por exemplo, o thread executando o Suspend, tente adquirir um bloqueio no primitivo. Nesta situação, o problema manifesta-se como um impasse.

Resolução

Evite designs que exijam o uso de Suspend e Resume. Para cooperação entre threads, use primitivos de sincronização como Lock, Monitor, ReaderWriterLock, Mutex, ou 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 é executado enquanto o thread está em um estado suspenso.

Efeito no tempo de execução

Este MDA não tem efeito sobre o CLR. Ele apenas relata 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 para o Suspend método que causa a ativação do 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