2009-09-13 33 views
56

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.Apartamento de un solo subproceso: no se puede crear una instancia del control ActiveX

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 solucionar esta u otra opción que AxWebBrowser?

Respuesta

68

El problema con el que se está encontrando 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 del apartamento STA en el hilo.

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

Gracias, genial, esto está funcionando. Una pregunta/problema más. La clase que estoy usando es solo clase y AxWebBrowser parece que debe agregarse a this.Controls(). ¿Hay alguna manera de falsificar los controles? ¿O tendré que haber separado Formulario para eso? –

+0

@ martin.malek No hay una gran manera de fingir eso. La mejor apuesta es crear una nueva forma. – JaredPar

+1

Hola, el código debe ser t.SetApartmentState (ApartmentState.STA); –

50

Seguir adelante y añadir [STAThread] a la entrada principal de la aplicación, esto indica el modelo COM de subprocesos es de un único subproceso (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()); 
    } 
} 
+0

buena y rápida solución para que mi aplicación de consola funcione – Esen

+0

¡buena solución! gracias –

+0

no funciona en el marco 4.5 - da argumentos inválidos en la última línea –

3

Si usó [STAThread] en la entrada principal de su aplicación y sigue recibiendo el error que podría necesitar para hacer 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 
    { 
     /// 
    } 
+0

¿Qué debería invocarse aquí? ¿El navegador? En que estado? En mi caso, el navegador está sentado en un diálogo. – C4u

Cuestiones relacionadas