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


contextSwitchDeadlock MDA

Управляемый помощник по отладке (MDA) contextSwitchDeadlock активируется при обнаружении взаимоблокировки во время попытки контекстной передачи СОМ.

Признаки

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

Причина

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

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

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

Существует возможность ложной активации этого MDA, если выполняются всех перечисленные ниже условия:

  • приложение создает компоненты СОМ из потоков STA либо прямо, либо косвенно, с помощью библиотек;

  • приложение было остановлено в отладчике, и пользователь продолжил работу приложения, либо выполнил поэтапную операцию;

  • функция неуправляемой отладки не включена.

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

ПримечаниеПримечание

Данный MDA представляет собой набор по умолчанию для Visual Studio 2005 и более поздних версий.Если в Visual Studio включен процесс размещения, отключить MDA, находящиеся в наборе по умолчанию, невозможно. Процесс размещения включается по умолчанию, поэтому его нужно отключить явным образом.Сведения об отключении MDA см. в разделе "Включение и отключение MDA" в Диагностика ошибок посредством управляемых помощников по отладке.

Решение

Следуйте правилам СОМ относительно загрузки сообщений STA.

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

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

Output

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

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

<mdaConfig>
  <assistants>
    <contextSwitchDeadlock enable="false" />
  </assistants>
</mdaConfig>

См. также

Ссылки

MarshalAsAttribute

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

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

Маршалинг взаимодействия

Другие ресурсы

Взаимодействие