程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> .net(c#)在循環語句中執行WebBrowser.Navigate();方法

.net(c#)在循環語句中執行WebBrowser.Navigate();方法

編輯:C#入門知識

最近在寫一個小程序的時候,遇到這樣的需求:

          已知一組網頁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_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            html = browser.DocumentText;  //獲取到的html.

            loading = false;//在加載完成後,將該變量置為false,下一次循環隨即開始執行.
        }

 

 

        上面的問題解決了,下面隨之而來的問題是:  有時候加載一張頁面的時候,browser_Navigated會執行多次.

查了下網上的資料,原因是頁面中含有<iframe></iframe>,每一個<iframe>都會觸發一次browser_Navigated,

所以,以上程序可以完善如下:

 

 

        bool loading = true;   //該變量表示網頁是否正在加載.
        string html = string.Empty;
        WebBrowser browser = new WebBrowser();

        public void GetHtml(string[] urls)
        {           &nbs

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved