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

原来的代码大致如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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方法里:

1
2
3
4
5
private void bar(WebClient client, string url)
{
      Thread.Sleep(30000);
      client.DownloadStringAsync(url);
}

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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没有问题。

posted @   平静寄居者  阅读(187)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示