浏览器自动化的一些体会11 webclient的异步操作
Posted badnumber
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浏览器自动化的一些体会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没有问题。
以上是关于浏览器自动化的一些体会11 webclient的异步操作的主要内容,如果未能解决你的问题,请参考以下文章
浏览器自动化的一些体会2 webBrowser控件之ajax
浏览器自动化的一些体会3 webBrowser控件之零碎问题