Visual Studio: ContextSwitchDeadlock - PullRequest
       26

Visual Studio: ContextSwitchDeadlock

143 голосов
/ 23 февраля 2009

Я получаю сообщение об ошибке, которое не могу устранить. Это происходит из Visual Studio или отладчика. Я не уверен, является ли окончательное состояние ошибки в VS, отладчике, моей программе или базе данных.

Это приложение для Windows. Не веб-приложение.

Первое сообщение от VS - это всплывающее окно, в котором говорится: «Никакие символы не загружены ни для одного кадра стека вызовов. Исходный код не может быть отображен». Когда это щелкают, я получаю: « ContextSwitchDeadlock был обнаружен » вместе с длинным сообщением, воспроизведенным ниже.

Ошибка возникает в цикле, который просматривает DataTable. Для каждой строки он использует значение ключа (HIC #) из таблицы в качестве параметра для SqlCommand. Команда используется для создания SqlDataReader, который возвращает одну строку. Данные сравниваются. Если обнаружена ошибка, строка добавляется во вторую таблицу данных.

Ошибка, по-видимому, связана с тем, сколько времени требуется для выполнения процедуры (т. Е. Через 60 с), а не с тем, сколько ошибок найдено. Я не думаю, что это проблема памяти. В цикле не объявляются переменные. Единственными объектами, которые создаются, являются SqlDataReaders, и они находятся в структуре Using. Добавление System.GC.Collect () не дало никаких результатов.

БД - это сайт SqlServer на том же ноутбуке.

В Форме нет причудливых штуковин или гаджетов.

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

Есть идеи, кто-нибудь?

Полная ошибка Текст: CLR не удалось перейти из контекста COM 0x1a0b88 в контекст COM 0x1a0cf8 в течение 60 секунд. Поток, которому принадлежит целевой контекст / квартира, скорее всего, либо делает ожидание без перекачки, либо обрабатывает очень длительную операцию без перекачки сообщений Windows. Эта ситуация, как правило, оказывает негативное влияние на производительность и может даже привести к тому, что приложение перестает отвечать на запросы или использование памяти постоянно увеличивается с течением времени. Чтобы избежать этой проблемы, все потоки однопоточных квартир (STA) должны использовать примитивы перекачки (такие как CoWaitForMultipleHandles) и регулярно перекачивать сообщения во время длительных операций.

Ответы [ 8 ]

245 голосов
/ 23 февраля 2009

ContextSwitchDeadlock не обязательно означает, что в вашем коде есть проблема, просто есть потенциал. Если вы перейдете к Debug > Exceptions в меню и развернете Managed Debugging Assistants, вы увидите, что ContextSwitchDeadlock включено. Если вы отключите это, VS больше не будет предупреждать вас, когда для обработки элементов требуется много времени. В некоторых случаях у вас действительно может быть длительная операция. Также полезно, если вы выполняете отладку и остановились на линии во время обработки - вы не хотите, чтобы она жаловалась, прежде чем у вас появилась возможность разобраться в проблеме.

13 голосов
/ 05 марта 2009

Как сказал Педро, у вас есть проблема с отладчиком, препятствующим прокачке сообщений, если вы перебираете код.

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

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

11 голосов
/ 23 февраля 2009

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

Вы должны посмотреть, как порождать фоновый поток для длительной работы, и вывести какое-то диалоговое окно "Я занят" для пользователя, пока это происходит.

6 голосов
/ 05 марта 2009

Если вы не хотите отключать это исключение, все, что вам нужно сделать, это позволить вашему приложению перекачивать некоторые сообщения хотя бы раз в 60 секунд. Это предотвратит это исключение. Попробуйте вызывать System.Threading.Thread.CurrentThread.Join (10) время от времени. Существуют и другие звонки, которые позволяют сообщениям качать.

1 голос
/ 21 июля 2016

Приведенное выше решение хорошо в некоторых сценариях, но есть другой сценарий, в котором это происходит, когда вы выполняете модульное тестирование и пытаетесь выполнить «Отладку выбранных тестов» из «Проводника тестов», когда для решения не установлено значение «Отладка».

В этом случае вам нужно сменить решение с версии Release или на то, что в этом случае установлено на Debug. Если это проблема, то изменение «ContextSwitchDeadlock» вам не поможет.

Я пропустил это сам, потому что сообщение об ошибке было настолько неприятным, что я не проверял очевидную вещь, которая была настройкой отладки!

0 голосов
/ 07 марта 2019

В Visual Studio 2017 снимите флажок с опции ContextSwitchDeadlock:

Отладка> Windows> Настройки исключений

enter image description here

В Windows настройки исключений: снимите флажок ContextSwitchDeadlock

enter image description here

0 голосов
/ 06 ноября 2017

Вы можете решить эту проблему, сняв флажок contextxtswitchdeadlock с

Отладка-> Исключения ... -> Развернуть узел MDA -> снять флажок -> contextswitchdeadlock

0 голосов
/ 07 июля 2017

В Visual Studio 2017 испанская версия.

"Депурар" -> "Вентаны" -> "Конфигурация исключений"

и поиск "ContextSwitchDeadlock". Затем снимите флажок. Или ярлык

Ctrl + D, Е

Best.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...