apartamento single-threaded - controle ActiveX não pode instanciar
-
07-07-2019 - |
Pergunta
Eu preciso para obter informações sobre os estilos CSS aplicados na página HTML. Eu costumava AxWebBrowser e iterate IHTMLDOMNode. Eu sou capaz de conseguir tudo necessidade dos dados I e mover o código para a minha candidatura. O problema é que esta parte está sendo executado dentro do trabalhador fundo e eu tenho exceção ao tentar instanciar o controle.
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 alguma maneira de como resolver isso ou outra opção do que AxWebBrowser?
Solução
O problema que você está correndo em é que a maioria das APIs segmento de segundo plano / trabalhador vai criar o segmento em um estado compartimento com vários segmentos. A mensagem de erro indica que o controle requer a rosca ser um Single Threaded Apartment.
Você pode contornar isso criando um fio-se e especificando o estado apartment STA no segmento.
var t = new Thread(MyThreadStartMethod);
t.SetApartmentState(ApartmentState.STA);
t.Start();
Outras dicas
Vá adiante e adicione [STAThread] para a entrada principal de sua aplicação, isso indica o modelo COM threading é single-threaded apartment (STA)
exemplo:
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());
}
}
Se você usou [STAThread]
à entrada principal de sua aplicação e ainda obter o erro pode ser necessário fazer uma chamada thread-safe para o controle ... algo como abaixo. No meu caso com o mesmo problema a seguinte solução funcionou!
Private void YourFunc(..)
{
if (this.InvokeRequired)
{
Invoke(new MethodInvoker(delegate()
{
// Call your method YourFunc(..);
}));
}
else
{
///
}