背景工作人员与foreach

本文关键字:foreach 工作人员 背景 | 更新日期: 2023-09-27 18:03:26

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

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);
         }
    }

程序应该对列表框

中的每个项目发出字符串的下载请求

的例子:

DownloadString http://127.0.0.1/sv/+ num.text并检查它是否包含一个特定的字符串

我需要它执行以下操作

DownloadString http://127.0.0.1/sv/ + num.text
if
DownloadedString contains uva 
then
listbox2.items.add(num.text)
else
next item from listbox1

背景工作人员与foreach

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

  1. 你正在使用后台工作器,不要,你应该使用任务和async/await
  2. 你在列表框中的每个项目循环两次,为什么?
  3. 你正在使用从未处理的事件订阅来旋转多个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%准确,也可能不代表最佳实践,例如,您可能希望并行下载数据,这将需要更改。