ActiveX控件无法实例化,因为线程处于单线程公寓中。在从睡眠状态唤醒计算机后发生。

3

我正在开发一个VOIP客户端(Window窗体),当有电话呼入或接入时,它会打开一个浏览器窗口(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)在代码中设置启动的线程,但是我得到了相同的结果。此外,在main()函数之前,我确实有[STAThread]。现在我在想,如果计算机休眠时线程没有正确终止是否更多是问题所在,但我不确定。我的背景是C ++和DirectX,这是我工作过的第一个Windows表单,所以任何帮助都将不胜感激。
跟进:在发现程序恢复后是在工作线程而不是主线程上启动的后,我能够解决这个问题。更多信息可以在此处阅读:Sleep(suspend)和Resuming windows form starts program on worker thread instead of main thread

这通常是由程序启动问题引起的。删除任何自定义的启动画面,并确保创建的第一个窗口在主线程上初始化。这可以确保SystemEvents类被正确初始化。 - Hans Passant
嗨,汉斯,感谢您的回复。创建的第一个窗口在主线程上初始化。然而,出错的不是第一个/主要表单。由主表单打开的浏览器窗口是导致错误的窗口。此外,我认为值得注意的是,在计算机进入睡眠模式然后唤醒后才会发生错误。在PowerChange时,表单被关闭,恢复时,表单再次运行,就像在初始加载时一样。 - madeFromCode
嗯,不太清楚,但浏览器肯定会生成这种错误。请注意您的问题标题是错误的,因为它抱怨它没有在STA线程上创建。我不知道OnPowerChange可能是什么,但迹象表明,您使用的任何事件都在错误的线程上运行,从而触发了投诉。 - Hans Passant
抱歉,OnPowerChange是我们已经订阅了PowerModeChanged事件的方法。标题是基于程序崩溃时收到的错误。经过进一步调试,我发现只有在程序睡眠和恢复后才会出现此问题。我还发现,程序恢复后运行在工作线程而不是主线程中。今天我将利用这些知识来寻找解决方法。发布时,我并不知道这一点。我接手了这个项目,所以我还在学习它的工作原理。感谢您的帮助,对混淆感到抱歉。 - madeFromCode
1个回答

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接