foreach循环中的WebBrowserDocumentCompletedEventHandler
本文关键字:WebBrowserDocumentCompletedEventHandler 循环 foreach | 更新日期: 2023-09-27 18:10:48
如何使documentCompleted事件在foreach循环中实际等待完成?
StaticStringclass。URLList是一个网站列表,所以就像www.google.com,www.aol.com。
任何建议都很棒。
StaticStringClass。
StaticStringClass.QueryHolder = new List<string>();
StaticStringClass.CrawledBit = new List<string>();
StaticStringClass.URLList = new List<string>();
string startingHTML = "http://www.decodethis.com/Default.aspx?tabid=65&vin=";
foreach (string listCar in StaticStringClass.CarIDs)
{
StaticStringClass.CarLister = listCar;
string realModel = string.Empty;
string realTrim = string.Empty;
string htmlHold = string.Empty;
string[] splitListCar = listCar.Split('|');
string realvin = splitListCar[1];
StaticStringClass.URLList.Add(startingHTML + realvin);
}
ProcessSites();
}
private Queue<string> downloadQueue = new Queue<string>();
public void ProcessSites()
{
foreach (string siteList in StaticStringClass.URLList)
downloadQueue.Enqueue(siteList);
webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
if (downloadQueue.Count > 0)
{
string nextSite = downloadQueue.Dequeue();
webBrowser1.Navigate(nextSite);
}
//foreach (string siteList in StaticStringClass.URLList)
//{
// webBrowser1.Navigate(siteList);
// webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
//}
}
这种方法不起作用。Navigate()
是一个异步操作-当您进入foreach
循环中的下一个siteList
时,它将不会完成。
你在这里的用例是什么?如果您只是试图下载这些网站,请使用WebClient
代替,或者如果您需要处理HTML,请使用htmllagilitypack:
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load("http://google.com");
var allDivs = doc.DocumentNode.Descendants("div");
否则,你可以通过使用下载队列来链接你的站点处理:在每个完成的事件处理程序中,你做常规处理,然后检查是否有更多的站点要下载,如果有,取消一个站点的队列并再次调用Navigate()
与新站点-冲洗和重复,即:
private Queue<string> downloadQueue = new Queue<string>();
public void ProcessSites()
{
foreach (string siteList in StaticStringClass.URLList)
downloadQueue.Enqueue(siteList);
webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
if (downloadQueue.Count > 0)
{
string nextSite = downloadQueue.Dequeue();
webBrowser1.Navigate(nextSite);
}
}
void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
//other processing here
if(downloadQueue.Count > 0)
{
string nextSite = downloadQueue.Dequeue();
webBrowser1.Navigate(nextSite);
}
}