Pregunta

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 obtuve una excepción al intentar instanciar el 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 forma de resolver esta u otra opción que AxWebBrowser?

¿Fue útil?

Solución

El problema con el que se encuentra es que la mayoría de las API de subprocesos / trabajadores en segundo plano crearán el subproceso en un estado de apartamento multiproceso. El mensaje de error indica que el control requiere que el subproceso sea un apartamento de subproceso único.

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

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

Otros consejos

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

Si usó [STAThread] en la entrada principal de su aplicación y aún recibe el error, es posible que deba realizar una Llamada segura para subprocesos al control. algo como abajo. ¡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
    {
        ///
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top