Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Примечание.
Эта статья относится к .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();
}