Поделиться через


dangerousThreadingAPI MDA

Примечание.

Эта статья относится к .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.

Помощник по отладке управляемого кода dangerousThreadingAPI (MDA) активируется, если метод Thread.Suspend вызывается не для текущего потока.

Симптомы

Приложение не отвечает. Данные системы или приложения могут остаться в непредсказуемом состоянии на какое-то время или даже после завершения работы приложения. Некоторые операции не завершаются должным образом.

Из-за случайного характера возникновения этой проблемы ее симптомы могут быть самыми разными.

Причина

Поток асинхронно приостанавливается другим потоком, использующим метод Suspend. Определить, безопасно ли приостанавливать другой поток, который в текущий момент времени может выполнять другие операции, невозможно. Приостановка потока может привести к повреждению данных или нарушению инвариантов. Если поток помещается в приостановленное состояние и никогда не возобновляется с помощью Resume метода, приложение может перестать отвечать и, возможно, повредить данные приложения. Эти методы помечены как устаревшие.

Если целевой поток удерживает примитивы синхронизации, они остаются в этом состоянии на протяжении всего времени приостановки. Это может привести к взаимоблокировкам в тех случаях, когда другой поток, например поток, выполняющий Suspend, пытается получить блокировку примитива. В этой ситуации проблема проявляется в виде взаимоблокировки.

Разрешение

По возможности не используйте в коде методы Suspend и Resume. Для сотрудничества между потоками используйте примитивы синхронизации, такие как Lock, Monitor, ReaderWriterLockMutexили оператор C#lock. Если эти методы все же необходимо использовать, постарайтесь свести к минимуму продолжительность приостановки потока и объем кода, выполняемого в это время.

Влияние на среду выполнения

Этот помощник отладки управляемого кода не оказывает никакого влияния на среду CLR. Он только сообщает сведения о небезопасных потоковых операциях.

Выходные данные

Этот помощник идентифицирует небезопасный потоковый метод, который стал причиной его активации.

Настройка

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

Пример

В следующем примере кода демонстрируется вызов метода Suspend, в результате которого активируется помощник 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();
}

См. также