Однопоточная квартира-не удается создать экземпляр элемента управления ActiveX
Мне нужно получить информацию о применяемых стилях CSS на HTML-странице. Я использовал AxWebBrowser и итерацию 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 в потоке.
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
{
///
}