contextSwitchDeadlock MDA

Note

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

Помощник contextSwitchDeadlock по управляемой отладке (MDA) активируется при обнаружении взаимоблокировки во время попытки перехода контекста COM.

Симптомы

Наиболее распространенным признаком является то, что вызов неуправляемого COM-компонента из управляемого кода не возвращается. Другим симптомом является увеличение использования памяти с течением времени.

Причина

Наиболее вероятной причиной является то, что поток однопоточной квартиры (STA) не перекачивает сообщения. Поток STA либо ожидает без перекачки сообщений, либо выполняет длительные операции и не позволяет очереди сообщений перекачиваться.

Увеличение использования памяти с течением времени вызвано тем, что поток завершения пытается вызвать Release неуправляемый COM-компонент, и этот компонент не возвращается. Это предотвращает восстановление других объектов методом завершения.

По умолчанию для основного потока консольных приложений Visual Basic используется модель потоков. Этот MDA активируется, если поток STA использует com-взаимодействие напрямую или косвенно с помощью среды CLR или стороннего элемента управления. Чтобы избежать активации этого MDA в консольном приложении Visual Basic, примените MTAThreadAttribute атрибут к основному методу или измените приложение для перекачки сообщений.

Этот MDA может быть ложно активирован при выполнении всех следующих условий:

  • Приложение создает com-компоненты из потоков STA напрямую или косвенно через библиотеки.

  • Приложение было остановлено в отладчике, и пользователь либо продолжил приложение, либо выполнил операцию шага.

  • Неуправляемая отладка не включена.

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

Note

Этот MDA находится в наборе по умолчанию для Visual Studio. Сведения об отключении mdAs см. в разделе "Диагностика ошибок" с помощью помощников по управляемой отладке.

Разрешение

Следуйте правилам COM относительно откачки сообщений STA.

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

Этот MDA не влияет на среду CLR. Он сообщает только данные о контекстах COM.

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

Сообщение, описывающее текущий контекст и целевой контекст.

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

<mdaConfig>
  <assistants>
    <contextSwitchDeadlock />
  </assistants>
</mdaConfig>

См. также