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();
}