问题描述:有一个网页列表,准备用webBrowser的navigate一个个去访问,然后获取页面内容。但navigate是异步的,一调用之后,不等待页面加载完毕,因为访问网页需要时间,取决于网速,程序就返回循环继续用下一个网址调用navigate,导致navigate不停的被调用,结果是一个网页都打不开,只有列表中最后一个列表,因为没有后续的干扰能被完整加载。
网上发现有人跟我情况一样,提供的方法能解决问题,引述如下:
-----------------------------------------------------------------------------------------------------------------
net(c#)在循环语句中执行WebBrowser.Navigate();方法,每次循环等待网页加载完后继续执行的解决方案.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_Navi