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