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);
}
}
这段代码有这么多错误,难怪会出错
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);
}
}
}