浏览器自动化的一些体会11 webclient的异步操作

原来的代码大致如下:

     private void foo(string url)
     {
            using (WebClient client = new WebClient())
            {
                client.DownloadProgressChanged += (obj, ev) =>
                {
                    client.CancelAsync();
                };

                client.DownloadStringCompleted += (obj, ev) =>
                {
                     ................
                     Thread.Sleep(30000);
                     bar(client, newUrl);
                }
            }
     }

     private void bar(WebClient client, string url)
     {

           client.DownloadStringAsync(url);
     }

  

本来以为这样可以自动访问一串网址(这里省略了取下一个url的代码),但运行后发现,经常会运行到一半停下来,程序并没有死掉,只是停止了,不继续访问下一个网址。

开始以为是Thread.Sleep()在做怪,把它移到bar方法里:

     private void bar(WebClient client, string url)
     {
           Thread.Sleep(30000);
           client.DownloadStringAsync(url);
     }

结果没用。想了半天,最后估计是访问某个网址时,一直在请求,但一直没收到数据,所以没有触发DownloadProgressChanged 事件。又因为是异步执行,所以UI没有阻塞。

最后用了个Timer控件,把代码改成:

     private void foo(string url)
     {
            using (WebClient client = new WebClient())
            {
                client.DownloadProgressChanged += (obj, ev) =>
                {
                    client.CancelAsync();
                };

                client.DownloadStringCompleted += (obj, ev) =>
                {
                     ................
                     if (timer1.Enabled)
                     {
                         timer1.Stop();
                     }
                     bar(client, newUrl);
                }
                timer1.Tick += (obj, ev) => {
                     timer1.Stop();
                     if (client.IsBusy)
                     {
                         client.CancelAsync();
                     }
                     else
                     {
                         bar(client, url);
                     }
                }
                bar(client, url);
            }
     }

     private void bar(WebClient client, string url)
     {
           Thread.Sleep(30000);
           client.DownloadStringAsync(url);
           timer1.Stop();
           timer1.Start();
     }

  

Timer的间隔也设成30秒。测试了几百个url没有问题。

原文地址:https://www.cnblogs.com/badnumber/p/12216522.html

时间: 2024-10-15 11:16:30

浏览器自动化的一些体会11 webclient的异步操作的相关文章

浏览器自动化的一些体会2 webBrowser控件之ajax

上个帖子简要讨论了浏览器自动化的几种方法.现在讨论webBrowser控件使用中的一些问题.基本的操作就不详细说了,随便网上找个帖子或找本书都有介绍的.这里只写点网上似乎少有人总结过的内容,以及自己的一些实践体会. 1.ajax 首先,DocumentCompleted事件对于ajax无能为力,因为这个事件不能处理网页加载完成后执行javascript发出ajax请求.网上可以找到的方法,主要有两种,一种是利用onpropertychange事件,随便找了个参考链接:https://social

浏览器自动化的一些体会10 稳定性的零星体会

浏览器自动化程序,感觉最难的就是稳定性.要实现无人值守自动执行,特别是在网络不太好的情况下连续不停顿正常运行8小时或更长时间,是不太容易的.因为很多异常情况难以预料.做好以下几点有帮助: 1)如果是在visual studio下调试,应该把Debug - Exceptions - Managed Debugging Assistants - ContextSwitchDeadLock 的Thrown的打勾去掉,这样可以避免运行到一半,突然出现一个提示,中断程序的执行. 2)如果是用webBrow

浏览器自动化的一些体会4 webBrowser控件之零碎问题2

1. DocumentCompleted的多次执行问题 有的网页,会多次触发DocumentCompleted事件,由于它是异步的,不会阻塞,所以如果不恰当处理,会造成某些代码被错误地多次执行,造成意想不到的结果. 我一般的做法,是定义一个全局变量(winform里form的成员变量),如下面代码所示: private string _type; private void button1_Click(object sender, EventArgs e) { _type = "test"

浏览器自动化的一些体会7 selenium webdriver的一些问题

1. 下载图片 这个链接说得最好,差不多所有可能的方法都列举了,除了没有提到用URLDownloadToFile,不过这和用WebClient差不多. https://stackoverflow.com/questions/18424624/using-selenium-to-save-images-from-page/48871283 2. 完全退出selenium 一般情况下,用webdriver的Quit方法就可以了.但是某些情况下,也有可能没用.这时,就只能杀进程了. 有意思的是,IEW

splinter python浏览器自动化操作,模拟浏览器的行为

Splinter可以非常棒的模拟浏览器的行为,Splinter提供了丰富的API,可以获取页面的信息判断当前的行为所产生的结果 最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有不少介绍,例如使用pamie,但是只是支持IE,而且项目也较久没有更新了.还 有就是利用selenium,可支持多种浏览器.网上资料比较多.经过比较,我选择了Splinter模块,因为利用Splinter开发浏览器自动化操 作,编写代码比较简单. 一.Splinter的安装 Splinter的使用必修依

自动化安装smokeping-2.6.11脚本

自动化安装Smokeping-2.6.11脚本 一.目的 1.1 监控目的 为方便监测各数据中心网络状况,自定义全国各节点,从而发现网络异常,判断网络故障. 1.2 本文目的 快速部署Smokeping系统,为后期相关工程师部署此系统提供借鉴与参考. 二.理论基础 2.1 相关理论 Smokeping百度解释:rrdtool的作者TobiOetiker 的作品,是用Perl语言编写完成,组件:RRDtool.Fping.Echoping.Curl.Dig.SSh.Perl 模块,Perl.Spe

Java+selenium+Firefox/ IE/ Chrome主流浏览器自动化环境搭建

一.java+selenium+firefox 1.环境准备:JDK1.8 2.安装firefox浏览器v59 3.下载驱动:https://github.com/mozilla/geckodriver/releases 4.selenium依赖pom.xml导入:https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java selenium 历史版本镜像下载地址:https://npm.taobao.org/m

Python自动化运维之11、面向对象基础

一.简介 面向对象编程是一种编程方式,使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用.类就是一个模板,模板里可以包含多个方法(函数),方法里实现各种各样的功能,对象则是根据模板创建的实例,通过实例,对象可以执行类中的方法,每个对象都拥有相同的方法,但各自的数据可能不同. 二.类.对象和方法 在Python中,定义类是通过class关键字,class后面紧接着是类名,类名通常是大写开头的单词,紧接着是('要继承的类名'),表示该类是从哪个类继承下来的

浏览器自动化项目【构思】

看了C#部分的功能阐述,觉得C#可以容纳网页的显示,她应该也是可以读取text指定部分的内容的,可行性还是很高的.而且既然我的思路都是可以写出来的,很清晰,那么用编程语言一定能实现.可以把300例中C#的功能都看一遍. 先做好师兄的那个项目,然后做这个更6. 下面是软件的目标: (1)打开软件,实现自动登录: (2)Alt+C 一键排版: (3)目前从在比较有挑战性的功能是:标题的填写,但是我的思路非常清晰: ①如果关键词字数大于等于8,只提取汉字然后直接使用: ②如果关键词字数等于7,则标题形