原来的代码大致如下:

     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没有问题。

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

  1. 浏览器自动化的一些体会9 访问angular页面的一个问题

    发现浏览器自动化有一个重要方面没有提及,即所谓的无页面浏览器,不过最近没有需求,不想尝试,先记上一笔,以后有需求时,可以有个思路. 大约一两个月前(现在比较懒散,时间不知不觉过去,连今天是几号有时候都 ...

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

    上个帖子简要讨论了浏览器自动化的几种方法.现在讨论webBrowser控件使用中的一些问题.基本的操作就不详细说了,随便网上找个帖子或找本书都有介绍的.这里只写点网上似乎少有人总结过的内容,以及自己的 ...

  3. 浏览器自动化的一些体会9 webBrowser控件之零碎问题3

    WebBrowser控件最大的优点是可以轻松嵌入win form程序中,但是微软好像对这个控件没什么兴趣,这么多年了还没有改进,结果造成一堆问题. 1. 不支持https 2. 缺省模拟ie 7,如果 ...

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

    1. 一般需要执行这一句:webBrowser1.ScriptErrorsSuppressed = true; 主要目的是禁止跳出javascript错误的对话框,否则会导致程序无法正确地跑下去.缺点 ...

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

    1. 下载图片 这个链接说得最好,差不多所有可能的方法都列举了,除了没有提到用URLDownloadToFile,不过这和用WebClient差不多. https://stackoverflow.co ...

  6. 浏览器自动化的一些体会6 增强的webBrowser控件

    这里谈两点 1.支持代理服务器切换 一种方法是修改注册表,不是太好的做法,而且,只能改全局设置,不能改局部(比如只让当前的webBrowser控件使用代理,而其他应用不用代理) 另外一个较好的方法,示 ...

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

    1. DocumentCompleted的多次执行问题 有的网页,会多次触发DocumentCompleted事件,由于它是异步的,不会阻塞,所以如果不恰当处理,会造成某些代码被错误地多次执行,造成意 ...

  8. 浏览器自动化的一些体会8 HttpWebRequest的几个问题

    前面说过了,httpWebRequest的好处在于轻量,不需要界面,缺点在于无法执行javascript.这里再归纳一些问题. 1. 设置代理 1) httpWebRequest不支持https的代理 ...

  9. 浏览器自动化的一些体会5 webBrowser控件之winform和webBrowser的交互

    从winform访问webBrowser,大致就是利用webBrowser提供的解析dom的方法以及用InvokeScript方法执行javascript.这个相对比较简单. 从webBrowser访 ...

随机推荐

  1. 手动造轮子——为Ocelot集成Nacos注册中心

    前言     近期在看博客的时候或者在群里看聊天的时候,发现很多都提到了Ocelot网关的问题.我之前也研究过一点,网关本身是一种通用的解决方案,主要的工作就是拦截请求统一处理,比如认证.授权.熔断. ...

  2. JAVA四大名著(程序员必读)

    JAVA四大名著: <JAVA语言程序设计(第4版)>-----初级 <JAVA核心技术>卷I----初级.<JAVA核心技术>卷II----中级 <JAVA ...

  3. 学会Python除了不能生孩子,其他的都能做。

    随着人工智能的迅猛发展,相信大家对于it行业最熟悉的词莫过于 Python.那么,Python究竟可以做些什么呢?一个资深程序员说:“学会Python除了不能生孩子,其他的都能做.”加入3137821 ...

  4. Zabbix添加监控主机

    一.监控server本机 1.查看主机列表 2.启动server主机的zabbix-agent服务 [root@zabbix ~]# systemctl start zabbix-agent.serv ...

  5. Java 匿名对象、内部类

    一.匿名对象 1.概念 匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量. public class Person{ public void eat(){ System.o ...

  6. redis启动报错:The Windows version of Redis allocates a memory mapped heap for sharing with

    windows系统下通过cmd命令:redis-server.exe redis.windows.conf 启动redis报错,控制台报错如下: The Windows version of Redi ...

  7. 第十四章 JDK新特性回顾

    14.1.JDK5新特性回顾 自动装箱.拆箱 静态导入 增强for循环 可变参数 枚举 泛型 元数据 14.2.JDK7新特性回顾 对Java集合(Collections)的增强支持 在switch中 ...

  8. 一分钟玩转 Spring IoC

    前言 「上一篇文章」我们对 Spring 有了初步的认识,而 Spring 全家桶中几乎所有组件都是依赖于 IoC 的. 刚开始听到 IoC,会觉得特别高大上,但其实掰开了很简单. 跟着我的脚步,一文 ...

  9. Seaborn基础2

    import matplotlib.pyplot as plt import seaborn as sns import numpy as np def sinplot(flip = 1): x = ...

  10. CSS两列布局的N种实现

    一.什么是两列布局 两列布局分为两种,一种是左侧定宽.右侧自适应,另一种是两列都自适应(即左侧宽度由子元素决定,右侧补齐剩余空间).在CSS面试题里面属于常考题,也是一个前端开发工程师必须掌握的技能, ...