Однопоточная квартира - не удается создать экземпляр элемента управления ActiveX
Мне нужно получить информацию о применяемых стилях CSS в HTML-странице. Я использовал AxWebBrowser и iterate IHTMLDOMNode. Я могу получить все необходимые данные и переместить код в свое приложение. Проблема в том, что эта часть работает внутри фонового рабочего и я получил исключение при попытке создать экземпляр элемента управления.
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.
есть ли способ, как решить этот или другой вариант, чем AxWebBrowser?
3 ответа:
проблема, с которой вы сталкиваетесь, заключается в том, что большинство фоновых потоков / рабочих API будут создавать поток в многопоточном состоянии квартиры. Сообщение об ошибке указывает, что элемент управления требует, чтобы поток был однопоточным квартирой.
вы можете обойти это, создав поток самостоятельно и указав состояние STA apartment в потоке.
var t = new Thread(MyThreadStartMethod); t.SetApartmentState(ApartmentState.STA); t.Start();
продолжайте и добавьте [STAThread] в главную запись вашего приложения, это означает, что модель com threading является однопоточной квартирой (STA)
пример:
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()); } }
Если вы используете
[STAThread]
к главной записи вашего приложения и по-прежнему получить ошибку вам может понадобиться сделать потокобезопасный вызов для Управление... что-то вроде ниже. В моем случае с той же проблемой сработало следующее решение!Private void YourFunc(..) { if (this.InvokeRequired) { Invoke(new MethodInvoker(delegate() { // Call your method YourFunc(..); })); } else { /// }