.net exception sta single-threaded

.net - Apartamento de un solo subproceso: no puede crear instancias de control ActiveX



exception single-threaded (3)

Continúe y agregue [STAThread] a la entrada principal de su aplicación, esto indica que el modelo de subprocesamiento COM es un apartamento de subproceso único (STA)

ejemplo:

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()); } }

Necesito obtener información sobre los estilos CSS aplicados en la página HTML. Usé AxWebBrowser e itere IHTMLDOMNode. Puedo obtener todos los datos que necesito y mover el código a mi aplicación. El problema es que esta parte se está ejecutando dentro del trabajador en segundo plano y recibí una excepción al intentar crear una instancia del control.

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.

¿Hay alguna manera de cómo resolver esta u otra opción que AxWebBrowser?


El problema al que se está enfrentando es que la mayoría de las API de thread / worker de fondo crearán el hilo en un estado de multiproceso. El mensaje de error indica que el control requiere que el hilo sea un único apartamento con rosca.

Puede solucionar esto creando un hilo usted mismo y especificando el estado de apartamento STA en el hilo.

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


Si usó [STAThread] en la entrada principal de su aplicación y sigue recibiendo el error, es posible que deba realizar una llamada Thread-Safe al control ... algo como a continuación. ¡En mi caso con el mismo problema, la siguiente solución funcionó!

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