foreach循环中的C#WebBrowserDocumentCompletedEventHandler

时间:2011-10-06 17:51:07

标签: c#

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


    }

1 个答案:

答案 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);
    }
}