首页登陆欢迎您!
首页登陆 > 操作系统 > 如何兑现webbrowser中navigate线程同步

如何兑现webbrowser中navigate线程同步

时间:2019-12-21

如何实现在WebBrowser上实现逐个URL的访问,访问完前一个后再访问后一个?下面代码,在第一个,第二个没有访问完时,就访问到第三个了,最终也只得到了最后一个URL指向的内容。另外,若用Application.DoEvents来完成等待的话,如何实现终止Application.DoEvents而不退出主窗体?

在做WIN FORM程序中经常要使用到升级功能,就需要从服务器上下载最新扔软件程序。如何下载呢?代码实现如下:

问题描述:有一个网页列表,准备用webBrowser的navigate一个个去访问,然后获取页面内容。但navigate是异步的,一调用之后,不等待页面加载完毕,因为访问网页需要时间,取决于网速,程序就返回循环继续用下一个网址调用navigate,导致navigate不停的被调用,结果是一个网页都打不开,只有列表中最后一个列表,因为没有后续的干扰能被完整加载。

string[]UrlArray=newstring[]{"","",""};WebBrowserwb1=newWebBrowser();for(inti=0;iUrlArray.Length;i++){wb1.Navigate(UrlArray[i]);}

        /// <summary>        
        /// c#,.net 下载文件        
        /// </summary>        
        /// <param name="URL">下载文件地址</param>       
        /// <param name="Filename">下载后的存放地址</param>        
        /// <param name="Prog">用于显示的进度条</param> 
        public void DownloadFile(string URL, string filename, System.Windows.Forms.ProgressBar prog, System.Windows.Forms.Label label1)
         {

网上发现有人跟我情况一样,提供的方法能解决问题,引述如下:

            float percent = 0;
            try
             {
                 System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(URL);
                 System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse();
                long totalBytes = myrp.ContentLength;
                if (prog != null)
                 {
                     prog.Maximum = (int)totalBytes;
                 }
                 System.IO.Stream st = myrp.GetResponseStream();
                 System.IO.Stream so = new System.IO.FileStream(filename, System.IO.FileMode.Create);
                long totalDownloadedByte = 0;
                byte[] by = new byte[1024];
                int osize = st.Read(by, 0, (int)by.Length);
                while (osize > 0)
                 {
                     totalDownloadedByte = osize + totalDownloadedByte;
                     System.Windows.Forms.Application.DoEvents();
                     so.Write(by, 0, osize);
                    if (prog != null)
                     {
                         prog.Value = (int)totalDownloadedByte;
                     }
                     osize = st.Read(by, 0, (int)by.Length);


                     percent = (float)totalDownloadedByte / (float)totalBytes * 100;
                     label1.Text = "当前补丁下载进度" + percent.ToString() + "%";
                     System.Windows.Forms.Application.DoEvents(); //必须加注这句代码,否则label1将因为循环执行太快而来不及显示信息
                 }
                 so.Close();
                 st.Close();
             }
            catch (System.Exception)
             {
                throw;
             }
         }

net(c#)在循环语句中执行WebBrowser.Navigate();方法,每次循环等待网页加载完后继续执行的解决方案.

 

最近在写一个小程序的时候,遇到这样的需求:

          已知一组网页url地址,想获取每一个网页的html,实际上就是想利用循环语句里面使用WebBrowser来加载每一个网页,然后获取他们的html,

          要实现这个功能,想想应该是件很简单的事情,但是在实际操作中却遇到了问题,因为循环语句和WebBrowser的加载不同步的原因,导致前一个

          前一个网页还没加载完,下一次循环又开始了....最终的结果是WebBrowser只获取到了最后一个页面的html.要解决这个问题,我们要做的就是

上一篇:Win10微软Edge浏览器扩展:由应用商店提供下载 - Windows7之家,Win7之家 下一篇:没有了