2009-09-13 8 views
56

HTML 페이지에 적용된 CSS 스타일에 대한 정보를 얻어야합니다. AxWebBrowser를 사용하고 IHTMLDOMNode를 반복합니다. 필요한 모든 데이터를 가져 와서 코드를 애플리케이션으로 옮길 수 있습니다. 문제는이 부분이 백그라운드 작업자 내부에서 실행되고 있으며 컨트롤을 인스턴스화 할 때 예외가 있다는 것입니다.단일 스레드 아파트 - ActiveX 컨트롤을 인스턴스화 할 수 없습니다.

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 이외의 다른 방법으로 해결할 방법이 있습니까?

답변

68

실행중인 문제는 대부분의 백그라운드 스레드/작업자 API가 다중 스레드 아파트 상태에서 스레드를 생성한다는 점입니다. 오류 메시지는 컨트롤이 스레드가 단일 스레드 아파트 인 것을 요구함을 나타냅니다.

스레드를 직접 만들고 스레드에서 STA 아파트 상태를 지정하면이 문제를 해결할 수 있습니다. 가서 응용 프로그램의 주요 항목에 [STAThread] 추가

var t = new Thread(MyThreadStartMethod); 
t.SetApartmentState(ApartmentState.STA); 
t.Start(); 
+1

감사합니다. 질문이나 문제가 하나 더 있습니다. 내가 사용하고있는 클래스는 클래스이고 AxWebBrowser는 this.Controls()에 추가해야하는 것처럼 보입니다. 컨트롤을 위조하는 방법이 있습니까? 아니면 Form을 분리해야합니까? –

+0

@ martin.malek 위조 할 방법이 없습니다. 가장 좋은 방법은 새 양식을 만드는 것입니다. – JaredPar

+1

안녕하세요. 코드는 t.SetApartmentState (ApartmentState.STA)이어야합니다. –

50

는, 이것은 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()); 
    } 
} 
+0

내 콘솔 앱이 멋지고 빠른 해결책 인 – Esen

+0

멋진 솔루션입니다! 덕분에 –

+0

프레임 워크 4.5에서 작동하지 않는 - 마지막 줄에 잘못된 인수를 제공 –

3

하는 경우 응용 프로그램의 주 항목에 [STAThread]을 사용했지만 여전히 오류가 발생하여 스레드 안전 호출을 다음과 같이 제어 할 수 있습니다. 같은 문제가있는 제 경우에는 다음 해결책이 효과가있었습니다!

Private void YourFunc(..) 
{ 
    if (this.InvokeRequired) 
    { 
     Invoke(new MethodInvoker(delegate() 
     { 
      // Call your method YourFunc(..); 
     })); 
    } 
    else 
    { 
     /// 
    } 
+0

여기서 호출해야하는 항목은 무엇입니까? 브라우저? 어떤 주 에서요? 내 경우에는 브라우저가 대화 상자에 앉아 있습니다. – C4u

관련 문제