2010-02-08 3 views
5

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

Managed DEBUGGING Помощника «ContextSwitchDeadlock» обнаружил проблему в «C: \ Documents и 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 Дополнительная информация: Текущий поток должен быть установлен в режим однопоточной квартиры (STA) до того, как вызовы OLE могут быть сделаны. Убедитесь, что ваша основная функция имеет STAThreadAttribute, отмеченный на нем. Это исключение возникает только в том случае, если к процессу прикреплен отладчик.

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

Спасибо заранее,

Лена

ответ

1

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

+0

Если я отключу тупик переключателя контекста, может ли он навредить? Я использую Visual Studio 2008. – 2010-02-08 19:16:08

+0

Ничто не взорвется. У вас может быть тупик. Вы узнаете достаточно быстро, ваша программа замерзнет. –

2

Вы должны убедиться, что ваш поток, который владеет COM компонент, не «заточен» с помощью обработки в течение> 60 секунд.

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

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

Смежные вопросы