2012-10-13 4 views
4

저는 꽤 많은 시간을 돌아 보았습니다. 웹 브라우저가 비동기 적으로 작동한다고 말하는 사람들은 모두 눈치 챘을 것입니다. 탐색을 트리거하고 심지어 DocumentComplete 이벤트를 구현하기 때문에 아무 일도 일어나지 않기 때문에 나는 잘못 생각합니다.웹 브라우저를 동 기적으로 탐색하려면 어떻게해야합니까?

메인 스레드 (웹 브라우저를 소유하고있는 스레드)가 자신의 작업을 수행했을 때만 웹 브라우저가 탐색을 시작합니다. 브라우저가 메인 스레드를 사용하여 명령을 실행하기 때문일 수 있습니다.

타이밍을 제어 할 수 있기를 원하기 때문에 나쁘다. 웹 브라우저가 페이지 로딩을 완료 한 후 내 작업을 계속할 수 있기를 원할 수 있기를 원한다. 이전에 말했던 것 때문에 폴링이 작동하지 않습니다. 웹 브라우저는 탐색을 시작하지 않습니다.

예 : 나는 그래서이 웹 브라우저의 문서 속성 및 기타 물건을 사용할 수 있습니다 동 기적으로 웹 브라우저를 사용할 수있는 방법

WebBrowser browser = new WebBrowser(); 

browser.Navigate(url); 
while(browser.ReadyState != WebBrowserReadyState.Complete) 
{ 
} 

// Then executing the next steps... 

, 나는 그래서 내가 할 수있는 차단 방법의 일종을 만들려면 WebBrowser가로드를 완료 한 시점을 제어하고 알 수 있습니다.

+3

아, 잠을 자지 않고 활성 대기 중입니다. 가장 좋은 방법은 아닙니다. – Vyktor

답변

5

메인 스레드를 탐색하면 문서가 완료 될 때까지 기다리지 않습니다. 따라서 전역 varibale을 통해 차단해야합니다. 더러운 해결책이 될 수 있습니다.

 bool IsReady; 
    void Go() 
    { 
     IsReady = false; 
     brw.Navigate("url"); 
     do 
     { 
      Thread.Sleep(10); 
      Application.DoEvents(); 
     } while (!IsReady); 
    } 

    void brw_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     IsReady = true; 
    } 

하지만 여기서 트릭은 예외가 발생하면 명시 적 예외없이 코드를 자동으로 중지합니다. 그래서 try catch 블록 내에서 웹 브라우저 관련 코드를 사용하는 것이 좋습니다.

+0

당신은 올바른 솔루션을 제공 한 사람이 처음이었습니다. 하지만 왜 내가 전에 document_Complete 이벤트를 처리하지 않았는지 알아야합니까? 어쩌면 브라우저가 그 당시에 다른 이벤트를 처리하고 있었고 블로킹을 유발했기 때문일 수 있습니까? – Matan

+0

do-while 루프 내에서 ApplicationDoEvents()를 호출하지 않으면 단일 스레드이므로 loop webbrowser가 calll 문서 완성 이벤트를 호출 할 수 없습니다. – aliassce

+0

그래서 웹 브라우저가 주 스레드를 사용합니까? 그것이 왜 전혀 탐색하지 않는 이유입니까? – Matan

관련 문제