Question

Je souhaite obtenir des informations sur les styles CSS appliqués dans une page HTML. J'ai utilisé AxWebBrowser et itérer IHTMLDOMNode. Je peux obtenir toutes les données dont j'ai besoin et transférer le code dans mon application. Le problème est que cette partie est en cours d’exécution à l’intérieur de l’agent d’arrière-plan et que j’ai eu une exception lors de la tentative d’instanciation du contrôle.

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-t-il un moyen de résoudre cette option ou une autre que AxWebBrowser?

Était-ce utile?

La solution

Le problème que vous rencontrez est que la plupart des API de thread / worker d'arrière-plan créeront le thread dans un état Apartment multithreaded. Le message d'erreur indique que le contrôle requiert que le thread soit un appartement à un seul thread.

Vous pouvez contourner ce problème en créant vous-même un thread et en spécifiant l'état d'appartement STA sur le thread.

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

Autres conseils

Allez-y et ajoutez [STAThread] à l'entrée principale de votre application, cela indique que le modèle de threading COM est un appartement simple thread (STA)

exemple:

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 vous avez utilisé [STAThread] dans l'entrée principale de votre application et obtenez toujours l'erreur, vous devrez peut-être passer un appel Thread-Safe au contrôle .. quelque chose comme ci-dessous. Dans mon cas, avec le même problème, la solution suivante a fonctionné!

Private void YourFunc(..)
{
    if (this.InvokeRequired)
    {
        Invoke(new MethodInvoker(delegate()
        {
           // Call your method YourFunc(..);
        }));
    }
    else
    {
        ///
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top