猿问

单线程单元-无法实例化ActiveX控件

我需要获取有关HTML页面中应用的CSS样式的信息。我使用了AxWebBrowser并迭代了IHTMLDOMNode。我能够获取所需的所有数据并将代码移入应用程序。问题是这部分正在后台工作程序内部运行,尝试实例化控件时出现异常。


AxWebBrowser browser = new AxWebBrowser();


ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated

because the current thread is not in a single-threaded apartment.

除了AxWebBrowser之外,还有什么方法可以解决此问题或其他选项?


qq_笑_17
浏览 838回答 3
3回答

红糖糍粑

您遇到的问题是,大多数后台线程/辅助API都会以“多线程单元”状态创建线程。错误消息表明控件要求线程是单线程单元。您可以通过自己创建一个线程并在该线程上指定STA公寓状态来解决此问题。var t = new Thread(MyThreadStartMethod);t.SetApartmentState(ApartmentState.STA);t.Start();

Cats萌萌

如果您习惯[STAThread]了应用程序的主条目,但仍然收到错误,则可能需要对控件进行线程安全调用 ……如下所示。对于我来说,同样的问题,以下解决方案有效!Private void YourFunc(..){    if (this.InvokeRequired)    {        Invoke(new MethodInvoker(delegate()        {           // Call your method YourFunc(..);        }));    }    else    {        ///    }
随时随地看视频慕课网APP
我要回答