单线程单元 – 不能实例化ActiveX控件

我需要获取有关HTML页面中应用的CSS样式的信息。 我用AxWebBrowser和迭代IHTMLDOMNode。 我能够获取所需的所有数据,并将代码移到我的应用程序中。 问题是,这部分运行在后台工作人员,我试图实例化控制exception。

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?

你遇到的问题是大多数后台线程/工作者API将创buildmultithreading公寓状态的线程。 该错误消息表明该控件要求该线程是一个单线程的公寓。

你可以通过自己创build一个线程并在线程中指定STA的公寓状态来解决这个问题。

 var t = new Thread(MyThreadStartMethod); t.SetApartmentState(ApartmentState.STA); t.Start(); 

继续并将[STAThread]添加到应用程序的主条目中,这表示COM线程模型是单线程单元(STA)

例:

 static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new WebBrowser()); } } 

如果你使用[STAThread]到你的应用程序的主要条目,并且仍然出现错误,则可能需要对控件进行线程安全调用 …如下所示。 在我的情况下,同样的问题下面的解决scheme工作!

 Private void YourFunc(..) { if (this.InvokeRequired) { Invoke(new MethodInvoker(delegate() { // Call your method YourFunc(..); })); } else { /// }