C# foreach的后台工作人员

C# foreach的后台工作人员,c#,foreach,backgroundworker,C#,Foreach,Backgroundworker,程序没有遵循逻辑,我需要它按照列表框中项目的顺序执行请求 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { foreach (var listBoxItem in listBox1.Items) { for (int j = 0; j < listBox1.Items.Count; j++) {

程序没有遵循逻辑,我需要它按照列表框中项目的顺序执行请求

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        foreach (var listBoxItem in listBox1.Items)
        {
            for (int j = 0; j < listBox1.Items.Count; j++)
            {
                string lista = listBox1.Items[j].ToString();
                string[] split = lista.Split(';');
                num.Text = split[0];
                v1.Text = split[1];
                v2.Text = split[2];    
                c.Text = split[3];
                WebClient client = new WebClient();
                client.Proxy = null;
                client.DownloadDataCompleted += new DownloadDataCompletedEventHandler(this.asyncWebRequest_DownloadDataCompleted);
                client.DownloadDataAsync(new Uri("http://127.0.0.1/sv/" + num.Text));
                j++;
            }
        }
    }

    private void asyncWebRequest_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
    {
         string @string = Encoding.Default.GetString(e.Result);
         if (@string.Contains("uva"))
         {
             this.listBox2.Items.Add(numero.Text);
         }
    }

这段代码有这么多错误,难怪会出错

  • 你在使用后台工作人员,不要,你应该使用和
  • 你在列表框中的每个项目上循环了两次,为什么
  • 您正在使用从未处理过的事件订阅启动多个web客户端-可能会泄漏一些内存
  • 我是这样做的:

    public async void ButtonThatStartsEverything_Click(object sender, EventArgs e)
    {
        await DoTheDownloadStuff();
    }
    
    public async Task DoTheDownloadStuff()
    {
        var client = new WebClient();
    
        foreach(var item in ListBox1.Items)
        {
            var expanded = item.Split(';');
            var num = expanded[0];
            var result = await client.DownloadDataAsyncTask(new Uri("http://127.0.0.1/sv/" + num));
            if (result.Contains("uva"))
            {
                listBox2.Items.Add(num);
            }
        }
    }
    
    请注意,代码是在Visual Studio之外编写的,可能不是100%准确,也可能不代表总体最佳做法,例如,您可能希望并行下载数据,这需要进行更改


    这段代码包含了您需要的所有基本内容。

    它的作用是什么?出了什么问题?没有逐项申请,只将第一个项目添加到ListBox2是否有任何异常?使用此代码可以创建
    listBox1.Items.Count
    并行连接。如果这是一个很大的数字,我认为这可能会导致一些流量问题。事实上,您的代码有太多的失败点-您在后台启动请求,但从不等待它们完成。这意味着可以在接收结果之前对
    WebClient
    实例进行垃圾收集。您忘记了处理
    WebClient
    实例并删除事件处理程序,这可能会导致异常。您对同一IP进行多次呼叫,这将达到每个域2个请求的限制等
    public async void ButtonThatStartsEverything_Click(object sender, EventArgs e)
    {
        await DoTheDownloadStuff();
    }
    
    public async Task DoTheDownloadStuff()
    {
        var client = new WebClient();
    
        foreach(var item in ListBox1.Items)
        {
            var expanded = item.Split(';');
            var num = expanded[0];
            var result = await client.DownloadDataAsyncTask(new Uri("http://127.0.0.1/sv/" + num));
            if (result.Contains("uva"))
            {
                listBox2.Items.Add(num);
            }
        }
    }