为啥WebClient

Posted

技术标签:

【中文标题】为啥WebClient【英文标题】:Why does WebClien为什么WebClient 【发布时间】:2017-12-31 16:18:35 【问题描述】:

我可以尝试从 url 获取字符串,但是当我执行程序时 GUI 冻结

【问题讨论】:

您的目标是什么版本的 .NET? 它会冻结,因为 WebClient 是同步的,所以它会阻塞整个循环。 我使用 .Net 3.5,所以 – Fran 我必须做什么? 最简单的方法是将代码放入将异步运行的后台工作中。 另外,MyIrancell BruteForce [ Status : Attacking ] 在您的问题中的存在让人有些怀疑! 【参考方案1】:

如果您在 4.5 之前以 .NET 为目标,则没有 async/await - 相反,您可以使用 DownloadStringAsync 的异步版本,它会在下载字符串时引发事件

var client = new WebClient();
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(DownloadStringCompletedHandler);

for (long i = 1; i < gethow; i++)

    string WebAdress = "https://xxxxxx.xxx/web?id=";
    var request = WebAdress + (fromNumber - 1 + i);    

    client.DownloadStringAsync(request);



// -- > Elsewhere in your form
void DownloadStringCompletedHandler(object sender, DownloadStringCompletedEventArgs e)

    slas = "0" + Convert.ToString((fromNumber - 1 + i));
    if (e.Result == "Test")
    
        if (!listBox1.Items.Contains(slas))
                        
             listBox1.Items.Add(slas);
             godn++;
         
    

如果您的所有代码必须在您的按钮点击中,您可以内联事件处理程序

var client = new WebClient();
client.DownloadStringCompleted += (s,e) => 
    slas = "0" + Convert.ToString((fromNumber - 1 + i));
    if (e.Result == "Test")
    
        if (!listBox1.Items.Contains(slas))
                        
             listBox1.Items.Add(slas);
             godn++;
         
    
;

for (long i = 1; i < gethow; i++)

    string WebAdress = "https://xxxxxx.xxx/web?id=";
    var request = WebAdress + (fromNumber - 1 + i);    

    client.DownloadStringAsync(request);



编辑:您已将问题中的代码更新为类似于此答案,但您假设 DownloadStringAsync 返回结果 - 它没有。该方法不返回任何内容。字符串在事件处理程序中返回

var client = new WebClient();
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(DownloadStringCompletedHandler);
result=client.DownloadStringAsync(request); // <-- This line is wrong

应该是

client.DownloadStringAsync(request);

并将DownloadStringCompletedHandler 中的字符串作为e.Result 接收

【讨论】:

好,但我不喜欢上课(所有作品都必须我在按钮内) @Pwn3rGamer 恐怕评论没有意义。你的意思是?我说的班级是你的表格! 结果在哪里?结果里面的结果必须从url下载字符串 所有工作都必须在按钮内我在 UI 代码中闻到(重)逻辑...@Pwn3rGamer 你应该把代码放到另一个类中,当按钮被点击...直接在事件处理程序中为 buttonclick 编写逻辑并不好 s 是事件的发送者(可能是 webclient 实例)。 e 是包含响应信息的事件参数(在这种情况下是下载结果)

以上是关于为啥WebClient的主要内容,如果未能解决你的问题,请参考以下文章

java htmlunit 抓取网页数据

Monotouch Webclient.CancelAsync ThreadInterruptedException

禁用 Spring Boot Webclient 日志

Spring Webflux Webclient |内容类型标题设置问题

V-4-2 安装vCenter组件

防止 HtmlUnit 2.13 执行 JavaScript