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


contextSwitchDeadlock MDA

Примечание.

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

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

Симптомы

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

Причина

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

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

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

Существует возможность ошибочной активации помощника отладки управляемого кода при соблюдении всех следующих условий:

  • Приложение создает компоненты COM из потоков однопотокового подразделения напрямую или косвенно с помощью библиотек.

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

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

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

Примечание.

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

Разрешение

Соблюдайте правила COM в отношении выдачи сообщений однопотокового подразделения.

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

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

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

Сообщение с описанием текущего контекста и целевого контекста.

Настройка

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

См. также