Странное сообщение о потоках в C # - PullRequest
5 голосов
/ 08 февраля 2010

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

Помощник по управляемой отладке ContextSwitchDeadlock обнаружил проблему в C: \ Documents and Settings \ Lena G \ Мои документы \ SchoolStuff \ IR Information \ Домашняя работа \ FianlProject \ finalProject \ finalProject \ bin \ Debug \ finalProject.vshost. EXE'. Дополнительная информация: CLR не удалось перейти из контекста COM 0x3407968 в контекст COM 0x3407ad8 в течение 60 секунд. Поток, которому принадлежит целевой контекст / квартира, скорее всего, либо делает ожидание без перекачки, либо обрабатывает очень длительную операцию без перекачки сообщений Windows. Эта ситуация, как правило, оказывает негативное влияние на производительность и может даже привести к тому, что приложение перестает отвечать на запросы или использование памяти постоянно увеличивается с течением времени. Чтобы избежать этой проблемы, все потоки однопотоковых квартир (STA) должны использовать примитивы перекачки (такие как CoWaitForMultipleHandles) и регулярно перекачивать сообщения во время длительных операций.

Я так понимаю, это как-то связано с тем, что он работает 60 секунд без остановки или что-то в этом роде? Как это проблема? Я также помещаю [STAThread] перед основной частью моей программы, потому что, если я удаляю ее, она показывает мне следующее сообщение:

Необработанное исключение типа 'System.Threading.ThreadStateException' произошло в System.Windows.Forms.dll Дополнительная информация: Для выполнения OLE-вызовов текущий поток должен быть установлен в однопотоковый режим (STA). Убедитесь, что на вашей главной функции помечен атрибут STAThreadAttribute. Это исключение возникает только в том случае, если к процессу подключен отладчик.

Кто-нибудь знает, как я могу решить эту проблему?

Заранее спасибо,

Lena

Ответы [ 2 ]

2 голосов
/ 08 февраля 2010

Необходимо убедиться, что ваш поток, которому принадлежит COM-компонент, не «заблокирован» при обработке в течение> 60 секунд.

Вероятно, происходит то, что у вас есть COM-объект в форме, и вы выполняете работу в потоке пользовательского интерфейса. Если ваш пользовательский интерфейс блокируется обработкой в ​​течение> 60 секунд, компонент COM может пожаловаться.

Подумайте об использовании BackgroundWorker экземпляра для управления вашим длительным процессом. Это подтолкнет работу в фоновый поток и позволит COM-компоненту обрабатывать сообщения без жалоб.

1 голос
/ 08 февраля 2010

Это предупреждение генерируется, когда вы выполняете вызовы объекта ActiveX из фонового потока и ваш основной поток блокируется. Возможно, более вероятно: в розничной версии Visual Studio 2005 была ошибка, которая приводила к отключению этого предупреждения без уважительной причины. Это исправлено в пакете обновления 1, убедитесь, что оно установлено. Еще один обходной путь - заткнись. Отладка + Исключения, Управляемые помощники отладки, снимите флажок ContextSwitchDeadlock. Но используйте SP1, если у вас его нет.

...