backgroundWorker 与 foreach

backgroundWorker with foreach

程序逻辑不对,我需要它按照列表框的项目顺序做请求

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

程序应该对列表框中的每个项目发出字符串的下载请求

示例:

下载字符串 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

这段代码错的太多了,难怪会出错。

  1. 你正在使用后台工作者,不要,你应该使用 Tasks and 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% 准确,并且可能不代表整体最佳实践,例如您可能希望并行下载数据,这需要进行更改。

此代码包含您需要的所有基本内容。