Single-threaded apartment – não é possível instanciar o controle ActiveX

Preciso obter informações sobre estilos CSS aplicados na página HTML. Eu usei AxWebBrowser e iterar IHTMLDOMNode. Consigo obter todos os dados de que preciso e movo o código para o meu aplicativo. O problema é que essa parte está sendo executada dentro do worker de segundo plano e tenho exceção ao tentar instanciar o controle.

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. 

Existe alguma maneira de resolver esta ou outra opção que o AxWebBrowser?

    O problema que você está enfrentando é que a maioria das APIs thread / worker em segundo plano criará o encadeamento em um estado Multithreaded Apartment. A mensagem de erro indica que o controle requer que o thread seja um Single Threaded Apartment.

    Você pode contornar isso criando um segmento você mesmo e especificando o estado do STA apartment no thread.

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

    Vá em frente e adicione [STAThread] à input principal do seu aplicativo, isso indica que o modelo de threading COM é single-threaded apartment (STA)

    exemplo:

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

    Se você usou [STAThread] para a input principal do seu aplicativo e ainda obter o erro, talvez seja necessário fazer uma chamada Segmentação Segura para o controle … algo como abaixo. No meu caso, com o mesmo problema, a solução a seguir funcionou!

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