Mieszkanie jednorodzinne - nie można uruchomić ActiveX control

Muszę uzyskać informacje o zastosowanych stylach CSS na stronie HTML. Użyłem AxWebBrowser i iterate IHTMLDOMNode. Jestem w stanie uzyskać wszystkie potrzebne dane i przenieść kod do mojej aplikacji. Problem polega na tym, że ta część działa wewnątrz workera w tle i dostałem wyjątek podczas próby utworzenia instancji kontroli.

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.

Czy Jest jakiś sposób na rozwiązanie tej lub innej opcji niż AxWebBrowser?

Author: martin.malek, 2009-09-13

3 answers

Problem polega na tym, że większość interfejsów API wątków / pracowników w tle utworzy wątek w wielowątkowym mieszkaniu. Komunikat o błędzie wskazuje, że sterowanie wymaga, aby gwint był pojedynczy gwintowany.

Możesz to obejść samodzielnie tworząc wątek i określając stan STA na wątku.

var t = new Thread(MyThreadStartMethod);
t.SetApartmentState(ApartmentState.STA);
t.Start();
 70
Author: JaredPar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-30 20:58:01

Śmiało i dodaj [STAThread] do głównego wpisu aplikacji, oznacza to, że model gwintowania COM jest jednowątkowym mieszkaniem (STA)

Przykład:

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());
    }
}
 54
Author: user764177,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-21 17:37:58

Jeśli użyłeś [STAThread] do głównego wpisu aplikacji i nadal masz błąd, może być konieczne wykonanie thread-Safe call do kontrolki... coś jak poniżej. W moim przypadku z tym samym problemem zadziałało następujące rozwiązanie!

Private void YourFunc(..)
{
    if (this.InvokeRequired)
    {
        Invoke(new MethodInvoker(delegate()
        {
           // Call your method YourFunc(..);
        }));
    }
    else
    {
        ///
    }
 3
Author: Ahmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-12 18:55:46