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-2025 CODEPRJ.COM