Что такое «COM-контекст», упоминаемый в сообщении MDA «ContextSwitchDeadlock»? - PullRequest
3 голосов
/ 21 июля 2009

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

В сообщении об ошибке, что такое шестнадцатеричное значение, называемое «COM-контекстом»?

Можно ли определить это значение для данного потока STA? Если да, то как?

Помощник по управляемой отладке ContextSwitchDeadlock обнаружил проблема в 'C: \ Program Files \ Microsoft Visual Studio 9,0 \ Common7 \ IDE \ vstesthost.exe. Дополнительная информация: CLR имеет не удалось перейти с COM контекст 0x14cff0 до COM контекст 0x14d218 в течение 60 секунд. Нить которому принадлежит пункт назначения контекст / квартира скорее всего либо делать не качать ждать или обработка очень долго работа без прокачки винды Сообщения. Эта ситуация обычно имеет отрицательное влияние на производительность и может даже привести к тому, что приложение становится не отвечает или использование памяти накапливается постоянно с течением времени. к избежать этой проблемы, все одиноки Резьба в квартире (STA) следует использовать прокачку примитивов ожидания (например, CoWaitForMultipleHandles) и регулярно качать сообщения в течение длительного текущие операции.

Ответы [ 4 ]

2 голосов
/ 26 октября 2009

Из того, что я вижу (глядя на разборку mscorwks), это IObjContext*, возвращенное из CoGetContextToken () .

В основном это выглядит так, как будто вызов ставится в очередь, используя IContextCallback::ContextCallback() из mscorwks!CtxEntry::EnterContextOle32BugAware(), который, в свою очередь, вызывает mscorwks!CtxEntry::EnterContextCallback(), как только контекст объекта (квартира) обрабатывает сообщение. Они используют CLREvent, чтобы сигнализировать о завершении обратного вызова. Для потоков STA отсутствие перекачки сообщений приведет к истечению времени ожидания события, что вызывает MDA ContextSwitchDeadlock.

Примечание: я не запускаю это в отладчике, поэтому не могу подтвердить поведение, но это, вероятно, достаточно точно.

0 голосов
/ 22 августа 2009

Скорее всего, модульный тест выполняется в режиме MTA, и в нем есть код, отображающий пользовательский интерфейс. Один COM-контекст - это visual studio, другой - пользовательский интерфейс внутри вашего модульного теста. Вы можете либо не отображать пользовательский интерфейс, либо отключить MDA.

0 голосов
/ 11 сентября 2009

Похоже, что приложение STA COM не вращает цикл сообщений. Это может привести к смерти STA COM. Я понятия не имел, что такое COM-контекст, но меня удивляет, что вы должны иметь возможность воспроизводить целевое приложение, чтобы оно зависало в течение длительного времени

Похоже, что есть функция, которая запускается более 60 секунд. Вы смогли изолировать это?

РЕДАКТИРОВАТЬ Это парень, который написал COM-взаимодействия для .NET.

http://blogs.msdn.com/cbrumme/

Загляните в его блог или посмотрите на форумы, которые он часто посещает. Он написал много материала о том, почему COM взаимодействует так, как есть. Это может помочь задать этот вопрос на одной из плат Microsoft.

0 голосов
/ 06 августа 2009

Я не видел этого раньше, я подозреваю, что это просто внутренний указатель. Обычно ни идентификаторы потоков, ни дескрипторы потоков не являются такими большими.

Не было никакого способа получить тип квартиры из текущего потока, и я никогда не видел идентификатора квартиры (кроме GUID, представляющего исходную / целевую квартиру при сортировке) в нативном коде.

...