Невозможно создать экземпляр элемента управления ActiveX, поскольку поток находится в однопоточном подразделении. Происходит после выхода ПК из спящего режима.

Я работаю над клиентом VOIP (форма окна), который открывает окно браузера (ExtendedWebBrowser) при совершении или получении вызова. Обычно он работает нормально, но если компьютер переведен в спящий режим, а затем проснулся, программа выйдет из строя со следующей ошибкой:

"System.Threading.ThreadStateException crossed a native/managed boundary
  Message=ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment."

Я попытался настроить потоки, начатые в коде с thread.SetApartmentState(ApartmentState.STA), но получаю тот же результат. Кроме того, у меня есть [STAThread] перед функцией main(). Теперь мне интересно, связано ли это с тем, что поток не завершается правильно, когда компьютер переводится в спящий режим, но я не уверен. Мой опыт работы с C ++ и DirectX, это первая форма Windows, над которой я работал, поэтому любая помощь будет принята с благодарностью.

Последующие действия: мне удалось решить эту проблему после того, как я обнаружил, что после возобновления программа запускалась в рабочем потоке, а не в основном потоке. Дополнительную информацию можно прочитать здесь: Sleep (suspend ) и возобновление формы окна запускает программу в рабочем потоке, а не в основном потоке


person madeFromCode    schedule 09.05.2012    source источник
comment
Обычно это вызвано проблемой при запуске вашей программы. Удалите все созданные вами настраиваемые заставки и убедитесь, что самое первое созданное окно инициализировано в основном потоке. Это гарантирует, что класс SystemEvents правильно инициализирован.   -  person Hans Passant    schedule 10.05.2012
comment
Привет, Ганс, спасибо за ответ. Первое созданное окно инициализируется в основном потоке. Однако первая / основная форма не является ошибкой. Окно браузера, открываемое основной формой, выдает ошибку. Кроме того, я считаю важным отметить, что ошибка возникает только после того, как компьютер перешел в спящий режим, а затем проснулся. OnPowerChange формы закрываются, и при возобновлении работы формы снова запускаются, как при начальной загрузке.   -  person madeFromCode    schedule 15.05.2012
comment
Что ж, непонятно, но браузер наверняка выдаст такую ​​ошибку. Обратите внимание на неправильный заголовок вашего вопроса, он жалуется, потому что не создается в ветке STA. Понятия не имею, что такое OnPowerChange, но есть признаки того, что любое используемое вами событие выполняется в неправильном потоке и, таким образом, вызывает жалобу.   -  person Hans Passant    schedule 15.05.2012
comment
К сожалению, OnPowerChange - это метод, который мы подписали на событие PowerModeChanged. Название основано на ошибке, которую я получаю при сбое программы. После дальнейшей отладки я обнаружил, что это происходит только после того, как программа перейдет в спящий режим и возобновит работу. Я также обнаружил, что, когда программа возобновляется, она выполняется в рабочем потоке, а не в основном потоке. Я буду работать с этими знаниями сегодня, чтобы, надеюсь, найти решение. На момент публикации я этого не знал. Я взял этот проект у другого разработчика, так что я все еще изучаю, как он работает. Спасибо за вашу помощь и извините за недоразумение.   -  person madeFromCode    schedule 15.05.2012


Ответы (1)


Мне удалось решить эту проблему. Когда программа выходила из спящего режима и вызывалась run(), она выполнялась в рабочем потоке событий Windows, а не в основном потоке. Дополнительную информацию можно прочитать здесь: Sleep (suspend ) и возобновление формы окна запускает программу в рабочем потоке, а не в основном потоке

person madeFromCode    schedule 17.05.2012