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


dangerousThreadingAPI MDA

Обновлен: Ноябрь 2007

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

Признаки

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

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

Причина

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

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

Решение

Следует избегать разработок, для которых требуется использование Suspend и Resume. Для совместной работы потоков следует использовать примитивы синхронизации, такие как Monitor, ReaderWriterLock, Mutex или оператор C# lock. Если необходимо использовать данные методы, следует сократить интервал времени и свести к минимуму объем кода, который выполняется, пока поток остановлен.

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

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

Результат

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

Конфигурация

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

См. также

Основные понятия

Диагностика ошибок посредством управляемых помощников по отладке

Ссылки

Thread

Оператор lock (Справочник по C#)