단일 스레드 아파트 - ActiveX 컨트롤을 인스턴스화 할 수 없습니다
-
07-07-2019 - |
문제
HTML 페이지에서 응용 CSS 스타일에 대한 정보를 가져와야합니다. 나는 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 보다이 옵션 또는 기타 옵션을 해결하는 방법이 있습니까?
해결책
문제는 대부분의 배경 스레드 / 작업자 API가 멀티 스레드 아파트 상태에서 스레드를 생성한다는 것입니다. 오류 메시지는 컨트롤이 스레드를 단일 스레드 아파트임을 나타냅니다.
스레드를 직접 만들고 스레드에 STA 아파트 상태를 지정 하여이 작업을 수행 할 수 있습니다.
var t = new Thread(MyThreadStartMethod);
t.SetApartmentState(ApartmentState.STA);
t.Start();
다른 팁
계속해서 응용 프로그램의 메인 항목에 [Stathread]를 추가하면 COM 스레딩 모델이 단일 스레드 아파트 (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
{
///
}
제휴하지 않습니다 StackOverflow