2012-10-13 114 views
4

我環顧四周,我注意到每個人都說webbrowser異步工作,我認爲它是錯誤的,因爲當我觸發Navigate甚至實現documentComplete事件時,什麼都不會發生。如何同步瀏覽網頁瀏覽器?

我注意到,當主線程(擁有webbrowser的線程)完成了他的工作後,webbrowser就開始導航,可能是因爲之後瀏覽器將使用主線程來執行他的命令。

現在不好,因爲我希望能夠控制時間,我希望能夠知道何時webbrowser完成加載頁面,然後繼續我的工作。由於我之前說過,輪詢不起作用,網頁瀏覽器甚至沒有開始導航。

例如:

WebBrowser browser = new WebBrowser(); 

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

// Then executing the next steps... 

我如何使用WebBrowser同步,所以我可以能夠使用WebBrowser的文檔屬性和其他的東西,我想創建某種阻塞的方法,所以我可以有控制權並且知道何時WebBrowser完成加載。

+3

啊,主動等待沒有睡覺。不是最好的方式去。 – Vyktor

回答

5

當你瀏覽你的主線程將不會等待文檔完成。所以你需要通過全局變量來阻止它。骯髒的解決方案可以;

 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塊中使用webbrowser相關的代碼。

+0

男人你是第一個給出正確解決方案的人,非常感謝!但是我必須知道它爲什麼沒有處理之前的document_Complete事件?也許是因爲瀏覽器當時正在處理其他事件並導致阻塞? – Matan

+0

如果您不在內部do-while循環中調用ApplicationDoEvents(),webbrowser無法調用documentcompleted事件,因爲它是單線程的。 – aliassce

+0

那麼webbrowser確實使用主線程?這就是爲什麼它沒有導航? – Matan