WebBrowser每次循環等待網頁加載完后繼續執行的解決方案


轉載於:http://www.cnblogs.com/yangxiaohu1/archive/2009/01/06/1370693.html

 

     最近在寫一個小程序的時候,遇到這樣的需求:

          已知一組網頁url地址,想獲取每一個網頁的html,實際上就是想利用循環語句里面使用WebBrowser來加載每一個網頁,然后獲取他們的html,

          要實現這個功能,想想應該是件很簡單的事情,但是在實際操作中卻遇到了問題,因為循環語句和WebBrowser的加載不同步的原因,導致前一個

          前一個網頁還沒加載完,下一次循環又開始了....最終的結果是WebBrowser只獲取到了最后一個頁面的html.要解決這個問題,我們要做的就是

          讓循環執行完前一次后等待網頁加載完,然后執行下一次循環去加載下面的網頁.....,按照這個思路,寫了以下程序,經測試果然有效.

 

 

復制代碼
bool  loading  =   true ;    // 該變量表示網頁是否正在加載.
         string  html  =   string .Empty;
        WebBrowser browser 
=   new  WebBrowser();

        
public   void  GetHtml( string [] urls)
        {            
            browser.Navigated 
+=   new  WebBrowserNavigatedEventHandler(browser_Navigated);
            
foreach  ( string  url  in  urls)
            {
                loading 
=   true ;   // 表示正在加載
                  browser.Navigate(url);

                
while  (loading)
                {
                    Application.DoEvents();
// 等待本次加載完畢才執行下次循環.
                }
            }
        }

        
void  browser_Navigated( object  sender, WebBrowserNavigatedEventArgs e)
        {
            html 
=  browser.DocumentText;   // 獲取到的html.

            loading 
=   false ; // 在加載完成后,將該變量置為false,下一次循環隨即開始執行.
        }
復制代碼

 

 

        上面的問題解決了,下面隨之而來的問題是:  有時候加載一張頁面的時候,browser_Navigated會執行多次.

查了下網上的資料,原因是頁面中含有<iframe></iframe>,每一個<iframe>都會觸發一次browser_Navigated,

所以,以上程序可以完善如下:

 

 

復制代碼
bool  loading  =   true ;    // 該變量表示網頁是否正在加載.
         string  html  =   string .Empty;
        WebBrowser browser 
=   new  WebBrowser();

        
public   void  GetHtml( string [] urls)
        {            
            browser.Navigated 
+=   new  WebBrowserNavigatedEventHandler(browser_Navigated);
            
foreach  ( string  url  in  urls)
            {
                loading 
=   true ;   // 表示正在加載
                browser.Navigate(url);

                
while  (loading)
                {
                    Application.DoEvents();
// 等待本次加載完畢才執行下次循環.
                }
            }
        }

        
int  i  =   0 ;
        
void  browser_Navigated( object  sender, WebBrowserNavigatedEventArgs e)
        {
            i
++ ;
            
if  (i  %   3   ==   0 //  假設每張頁面要執行3次browser_Navigated方法,那么這表示網頁全部內容加載完成.(至於這個3要怎么樣得到,那是仁者見仁的事情了,呵呵)
            {
                html 
=  browser.DocumentText;   // 獲取到的html.

                loading 
=   false ; // 在加載完成后,將該變量置為false,下一次循環隨即開始執行.
            }
        }
復制代碼

 

 

以上只是筆者在工作中的一點小總結,寫出來做個筆記,也希望能給其他人帶來一些幫助.相信解決此問題的方法頗多,望不吝賜教...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM