如何使documentCompleted事件在foreach循环中实际等待完成。
StaticStringclass.URLList是一个网站列表,就像www.google.com,www.aol.com一样。
任何建议都很棒。
StaticStringClass.holderList = new Queue();
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);
//}
}
答案 0 :(得分:2)
这种方法不起作用。 Navigate()
是一种异步操作 - 当您转到siteList
循环中的下一个foreach
时,它不会完成。
这里的用例是什么?如果您只是尝试下载这些网站,请使用WebClient
,或者如果您需要处理HTML,请使用HtmlAgilityPack:
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);
}
}