Я получаю сообщение об ошибке, которое не могу устранить. Это происходит из Visual Studio или отладчика. Я не уверен, является ли окончательное состояние ошибки в VS, отладчике, моей программе или базе данных.
Это приложение для Windows. Не веб-приложение.
Первое сообщение от VS - это всплывающее окно, в котором говорится: «Ни для одного кадра стека вызовов не загружены символы. Исходный код не может быть отображен». Когда это щелкают, я получаю: « ContextSwitchDeadlock был обнаружен », наряду с длинным сообщением, воспроизведенным ниже.
Ошибка возникает в цикле, который просматривает DataTable. Для каждой строки он использует значение ключа (HIC #) из таблицы в качестве параметра для SqlCommand. Команда используется для создания SqlDataReader, который возвращает одну строку. Данные сравниваются. Если обнаружена ошибка, строка добавляется во второй DataTable.
Ошибка, по-видимому, связана с тем, сколько времени занимает процедура (т. Е. Через 60 секунд), а не с тем, сколько ошибок найдено. Я не думаю, что это проблема памяти. В цикле не объявляются переменные. Единственными объектами, которые создаются, являются SqlDataReaders, и они находятся в структуре Using. Добавление System.GC.Collect () не дало эффекта.
БД - это сайт SqlServer на том же ноутбуке.
Там нет никаких причудливых вещиц или гаджетов в форме.
Я не знаю ничего в этом процессе, что сильно отличается от того, что я делал десятки раз раньше. Я видел ошибку раньше, но никогда не на постоянной основе.
Любые идеи, кто-нибудь?
Полная ошибка Текст: CLR не удалось перейти из контекста COM 0x1a0b88 в контекст COM 0x1a0cf8 в течение 60 секунд. Поток, который владеет целевым контекстом / квартирой, скорее всего либо выполняет некачивающее ожидание, либо обрабатывает очень длительную операцию без прокачки сообщений Windows. Эта ситуация, как правило, оказывает негативное влияние на производительность и может даже привести к тому, что приложение перестает отвечать на запросы или использование памяти постоянно увеличивается с течением времени. Чтобы избежать этой проблемы, все потоки однопотоковых квартир (STA) должны использовать примитивы перекачки ожидания (такие как CoWaitForMultipleHandles) и регулярно перекачивать сообщения во время длительных операций.
источник
ctrl-alt-e
приносит диалог исключения.Debug -> Windows -> Exceptions Settings
. Тогда воспользуйся поискомКак сказал Педро, у вас есть проблема с отладчиком, мешающим прокачке сообщений, если вы перебираете код.
Но если вы выполняете длительную операцию в потоке пользовательского интерфейса, тогда вызовите Application.DoEvents (), который явно прокачивает очередь сообщений и затем возвращает управление вашему текущему методу.
Однако, если вы делаете это, я бы порекомендовал взглянуть на ваш дизайн, чтобы вы могли выполнять обработку вне потока пользовательского интерфейса, чтобы ваш пользовательский интерфейс оставался красивым и быстрым.
источник
Похоже, вы делаете это в главном потоке пользовательского интерфейса в приложении. Поток пользовательского интерфейса отвечает за прокачку оконных сообщений по мере их поступления, и все же, поскольку ваши сообщения заблокированы в вызовах базы данных, он не может этого сделать. Это может вызвать проблемы с общесистемными сообщениями.
Вы должны посмотреть, как порождать фоновый поток для длительной работы, и вывести какое-то диалоговое окно «Я занят» для пользователя, пока это происходит.
источник
В Visual Studio 2017 снимите флажок с опции ContextSwitchDeadlock:
Отладка> Windows> Настройки исключений
В Windows настройки исключений: снимите флажок ContextSwitchDeadlock
источник
Если вы не хотите отключать это исключение, все, что вам нужно сделать, это дать приложению возможность отправлять некоторые сообщения не реже одного раза в 60 секунд. Это предотвратит это исключение. Попробуйте вызывать System.Threading.Thread.CurrentThread.Join (10) время от времени. Есть и другие звонки, которые позволяют делать сообщения.
источник
Вышеупомянутое решение хорошо в некоторых сценариях, но есть другой сценарий, в котором это происходит, когда вы проводите модульное тестирование, и вы пытаетесь «Отладить выбранные тесты» из Test Explorer, когда для вашего решения не задано Debug.
В этом случае вам нужно сменить решение с версии Release или на то, что в этом случае установлено на Debug. Если это проблема, то изменение «ContextSwitchDeadlock» действительно не поможет вам.
Я пропустил это сам, потому что сообщение об ошибке было настолько неприятным, что я не проверял очевидную вещь - настройку отладки!
источник
В Visual Studio 2017 испанская версия.
и поиск "ContextSwitchDeadlock". Затем снимите флажок. Или ярлык
Лучший.
источник
Вы можете решить эту проблему, сняв флажок contextswitchdeadlock от
Отладка-> Исключения ... -> Развернуть узел MDA -> снять флажок -> contextswitchdeadlock
источник
Я получил эту ошибку и переключил запросы на асинхронный (await (...). ToListAsync ()). Все хорошо сейчас.
источник