문제

부모 스레드가 BackgroundWorker이고 다른 할 일이 많기 때문에 백그라운드 STA 스레드에서 동적으로 인스턴스화되는 WebBrowser 컨트롤이 있습니다.

문제는 .Navigate()에 지시한 메서드에서 MessageBox.Show()를 팝업하지 않는 한 Navigated 이벤트가 절대 실행되지 않는다는 것입니다.나는 다음을 설명하겠다:

ThreadStart ts = new ThreadStart(GetLandingPageContent_ChildThread);
Thread t = new Thread(ts);
t.SetApartmentState(ApartmentState.STA);
t.Name = "Mailbox Processor";
t.Start();

protected void GetLandingPageContent_ChildThread()
{
 WebBrowser wb = new WebBrowser();
 wb.Navigated += new WebBrowserNavigatedEventHandler(wb_Navigated);
 wb.Navigate(_url);
 MessageBox.Show("W00t");
}

protected void wb_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
 WebBrowser wb = (WebBrowser)sender; // Breakpoint
 HtmlDocument hDoc = wb.Document;
}

이것은 잘 작동합니다.하지만 자동화 앱이기 때문에 메시지 상자가 방해가 됩니다.MessageBox.Show()를 제거하면 WebBrowser.Navigated 이벤트가 실행되지 않습니다.저는 이 줄을 Thread.Sleep()으로 대체하고 상위 스레드를 일시 중단해 보았습니다.

이 문제를 해결한 후에는 WebBrowser가 작업을 수행하는 동안 상위 스레드를 일시 중단하고 결과 HTML을 상위 스레드에 다시 전달하여 추가 논리를 계속할 수 있는 방법을 찾으려고 합니다.

왜 이런 일을 하는가?어떻게 해결할 수 있나요?

누군가 웹 페이지의 콘텐츠를 가져오고, 일부 데이터를 입력하고, 제출 버튼 반대편에 페이지 콘텐츠를 반환하는 방법을 제공할 수 있다면 이 모든 작업은 POST 동사나 지원하지 않는 웹 서버에 대해 수행됩니다. QueryString을 통해 데이터를 전달하는 경우 이 전체 연습이 불필요하므로 해당 답변도 수락하겠습니다.


해결책: 결국 팀 설계자의 제안으로 BackgroundWorker와 슬레이브 스레드를 전혀 사용하지 않게 되었습니다...반응성을 희생하더라도 :(

도움이 되었습니까?

해결책

WebBrowser 표시되지 않고 UI 스레드가 관련되어 있지 않으면 많은 일을하지 않습니다. 당신은 그것이 상주하는 형태를 보여주고 있습니까? DOM 등을 사용해야합니다. 폼은 사용자에게 표시하지 않으려면 화면을 오프 스크린 일 수 있지만 서비스에서는 잘 작동하지 않습니다 (예를 들어).

스크래핑 목적으로 일반적으로 사용하는 정기적 인 HTML Browwser를 시뮬레이션 할 수 있습니다. WebClient 등. 충분하지 않습니까? "와 같은 도구를 사용할 수 있습니다.바이올리니스트"서버에 대한 정확한 요청을 조사하려면 그 이상으로, 당신은 HTML 민첩성 팩, 브라우저없이 HTML에 대한 DOM 액세스를 제공합니다.

다른 팁

웹 브라우저의 가시성이 False로 설정된 경우 탐색 및 Document Complete 이벤트가 발사되지 않습니다. WebBrowser를 가시적으로 만들어서 위치를 설정하여 다음과 같은 위치를 설정 하여이 한계를 해결할 수 있습니다.

wb.Visible = true;
wb.Left = -wb.Width; // notice the minus sign

다음과 같은 선을 추가해야합니다.

webBrowser1.Navigated += new WebBrowserNavigatedEventHandler(webBrowser1_Navigated);

어디 webBrowswer1_Navigated 이벤트가 시작될 때 호출하려는 기능입니다.

이미 시작된 GUI 스레드가 있습니까?아마도 WebBrowser 개체는 GUI 스레드를 사용하여 이벤트를 처리할 수 있습니다.이 경우 WebBrowser를 생성하는 스레드에서 Application.Run()을 호출해야 합니다(MessageBox.Show()를 이 스레드로 대체).Application.Run()은 Application.Exit()가 호출될 때까지 중단됩니다.

지금 이것을 테스트하려고 합니다.

나는 결국 팀 아키텍트의 제안에 따라 배경 노동자와 노예 스레드를 전혀 사용하지 않았다.

웹 브라우저 컨트롤은 STA 스레드에 있지 않으면 작동 할 수 없습니다. 스레드에서 WebBrowser 인스턴스를 사용하려면 스레드를 만들고 호출해야합니다. Thread.SetApartmentState(ApartmentState.STA);

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top