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
这段代码错的太多了,难怪会出错。
- 你正在使用后台工作者,不要,你应该使用 Tasks and 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% 准确,并且可能不代表整体最佳实践,例如您可能希望并行下载数据,这需要进行更改。
此代码包含您需要的所有基本内容。
程序逻辑不对,我需要它按照列表框的项目顺序做请求
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
这段代码错的太多了,难怪会出错。
- 你正在使用后台工作者,不要,你应该使用 Tasks and 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% 准确,并且可能不代表整体最佳实践,例如您可能希望并行下载数据,这需要进行更改。
此代码包含您需要的所有基本内容。