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);
        //}

    }

foreach循环中的WebBrowserDocumentCompletedEventHandler

这种方法不起作用。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);
    }
}
相关文章:
  • 没有找到相关文章