문제

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
    {
        ///
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top