Я запускаю приложение C # и во время выполнения получаю следующую ошибку:
CLR не смогла перейти из COM-контекста 0x20e480 в COM-контекст 0x20e5f0 в течение 60 секунд. Поток, которому принадлежит целевой контекст / квартира, скорее всего, либо выполняет ожидание без перекачки, либо обрабатывает очень длительную операцию без перекачки сообщений Windows. Эта ситуация обычно отрицательно сказывается на производительности и может даже привести к тому, что приложение перестает отвечать или использование памяти постоянно накапливается с течением времени. Чтобы избежать этой проблемы, все потоки однопоточного подразделения (STA) должны использовать примитивы ожидания перекачки (такие как CoWaitForMultipleHandles) и регулярно перекачивать сообщения во время длительных операций.
Может ли кто-нибудь помочь мне с проблемой здесь?
Большое спасибо.
источник
Чтобы узнать, какая операция блокирует переключение контекста и вызывает отображение MDA contextSwitchDeadlock , можно использовать следующие шаги. Обратите внимание, что я буду иметь в виду Visual Studio 2012.
Предполагая, что вы решаете не переносить ресурсоемкую операцию из основного потока - прежде чем это сделать, ознакомьтесь с некоторыми другими ответами и комментариями - у вас есть следующие параметры для отключения помощников по управляемой отладке.
В отладчике Visual Studio
Вне отладчика Visual Studio
Примечание. Один из первых двух параметров должен иметь значение 1, чтобы третий работал.
В моем случае проблема заключалась в вызове ObjectContext.SaveChanges () в Entity Framework в консольном приложении. После применения атрибута MTAThreadAttribute к
Main()
методу исключение ContextSwitchDeadlock больше не возникало . К сожалению, я не уверен во всех последствиях этого изменения.источник
Это сообщение указывает, что какой-то ваш код пытается переключить потоки, а целевой поток занят. Например, фоновый поток пытается отправить вызов потоку пользовательского интерфейса для обновления пользовательского интерфейса, в то время как пользовательский интерфейс некоторое время работает в замкнутом цикле.
Чтобы понять, что происходит, вам нужно войти в отладчик и посмотреть на все потоки и то, что они делают.
источник
В некоторых случаях:
Отладка -> Исключения -> Управляемые помощники отладки
и снятие отметки с элемента ContextSwitchDeadlock.
источник
Просто выберите «Исключения» из меню «Отладка» в окне Visual Studio 2005, появится всплывающее диалоговое окно «Edxception», выберите узел исключения «Управляемые помощники отладки», затем выберите ContextSwitchDeadlock и удалите выбор из столбца «Выброшенные». это остановит vs от выброса исключения ContextSwitchDeadlock.
Надеюсь это поможет..
источник
Я столкнулся с этой проблемой, когда пытался выяснить, почему я
OracleDataReader
генерировал исключение. Я думал, что это произошло из-за того, что оно было назначено,null
потому что исключение было связано с параметром, имеющим значение null. Так я и сделал:while (dr.Read()) { while (dr != null) // <-- added this line { ...
Оказалось, что
dr
это НИКОГДА не было нулевым, и поэтому цикл просто продолжался и продолжался до тех пор, пока не пришло это сообщение, и снова и снова, потому что вы можете нажать «Продолжить», чтобы продолжить, пока у вас не закончится память (не делайте этого - вместо этого нажмите "ОК"). Итак, мораль истории: ищите утечки памяти, которые передают данные из базы данных в память в бесконечных циклах. Ошибка на самом деле пытается предупредить вас о плохом сценарии. Лучше прислушаться к этому.источник
Эта ошибка возникала у меня много раз, и я проследил ее до итерации в
DataGridViewRow
, в которой я установил значение флажка в значение true. Поскольку я работал в режиме отладки, у меня была возможность продолжить, поэтому я смог сделать именно это.Я надеюсь, что это поможет кому-то.
источник
Предполагая, что вы используете Visual Studio, вы можете щелкнуть
Ctrl+Alt+E
текущий проект, и отобразится окно исключений с выбором помощников по управляемой отладке, вы должны снять флажок с параметра «ContextSwitchDeadlock». затем создайте текущий проект.источник