C#中的BackgroundWorker运行多次
BackgroundWorker in C# runs multiple times
我正在编写一个执行特定任务(检查某物)的程序,当我使用后台工作程序(多个)时,它们会执行多次。我只希望它们执行一次。
我有一个按钮,代码如下:
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Text Documents|*.txt|All Files|*.*";
ofd.ShowDialog();
string filename = ofd.FileName;
SortList(filename);
排序列表功能,将文件排序成多个列表,我稍后将用于后台工作。
public void SortList(string file)
{
string[] names = System.IO.File.ReadAllLines(file);
int list = 1;
for (int i = 0; i < names.Length; i++)
{
switch (list)
{
case 1:
l1.Add(names[i]);
break;
case 2:
l2.Add(names[i]);
break;
case 3:
l3.Add(names[i]);
break;
case 4:
l4.Add(names[i]);
break;
case 5:
l1.Add(names[i]);
list = 1;
break;
}
list++;
}
backgroundWorker1.RunWorkerAsync();
backgroundWorker2.RunWorkerAsync();
backgroundWorker3.RunWorkerAsync();
backgroundWorker4.RunWorkerAsync();
}
这个功能没有问题,我已经调试过了,列表按应有的方式拆分,没有多余的行等。问题是后台工作人员多次工作。
我的最后一个函数是检查函数,它看起来像这样:
public void CheckList(List<string> names)
{
for (int i = 0; i < names.Count(); i++)
{
try
{
foreach (string s in names)
{
uu.parsePage("Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)", s);
string[] r = { uu.followers.ToString(), uu.followingcount, uu.isVerified.ToString() };
listView1.Invoke(new Action(() => listView1.Items.Add(uu.username).SubItems.AddRange(r)));
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
而每个后台工作者都有一个这样的代码:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
CheckList(l1);
}
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
CheckList(l2);
}
private void backgroundWorker3_DoWork(object sender, DoWorkEventArgs e)
{
CheckList(l3);
}
private void backgroundWorker4_DoWork(object sender, DoWorkEventArgs e)
{
CheckList(l4);
}
我已经调试了一些,但我无法找出后台工作人员多次执行该工作的原因。有什么冲突或我做错了什么吗?谢谢。
我使用的示例文件:
danbilzerian
dailywatch
fitness
fitspo
bodyofrachael
这是 5 个条目,后台工作人员多次完成一些工作,最终看起来像这样:
问题出在 CheckList 方法中。
第一个循环的目的是什么?
您在第一个循环中循环 "names",然后在 foreach 中循环。
由于您没有使用 i 计数器,因此第一个循环似乎没有用。
BackgroundWorker 事件不会被执行超过一次,为了确保这一点,只需在 DoWork 事件中为每个事件使用 Console.WriteLine("BackGroundWork 1 Started");
并检查"Output" Window.
中的输出
我正在编写一个执行特定任务(检查某物)的程序,当我使用后台工作程序(多个)时,它们会执行多次。我只希望它们执行一次。
我有一个按钮,代码如下:
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Text Documents|*.txt|All Files|*.*";
ofd.ShowDialog();
string filename = ofd.FileName;
SortList(filename);
排序列表功能,将文件排序成多个列表,我稍后将用于后台工作。
public void SortList(string file)
{
string[] names = System.IO.File.ReadAllLines(file);
int list = 1;
for (int i = 0; i < names.Length; i++)
{
switch (list)
{
case 1:
l1.Add(names[i]);
break;
case 2:
l2.Add(names[i]);
break;
case 3:
l3.Add(names[i]);
break;
case 4:
l4.Add(names[i]);
break;
case 5:
l1.Add(names[i]);
list = 1;
break;
}
list++;
}
backgroundWorker1.RunWorkerAsync();
backgroundWorker2.RunWorkerAsync();
backgroundWorker3.RunWorkerAsync();
backgroundWorker4.RunWorkerAsync();
}
这个功能没有问题,我已经调试过了,列表按应有的方式拆分,没有多余的行等。问题是后台工作人员多次工作。
我的最后一个函数是检查函数,它看起来像这样:
public void CheckList(List<string> names)
{
for (int i = 0; i < names.Count(); i++)
{
try
{
foreach (string s in names)
{
uu.parsePage("Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)", s);
string[] r = { uu.followers.ToString(), uu.followingcount, uu.isVerified.ToString() };
listView1.Invoke(new Action(() => listView1.Items.Add(uu.username).SubItems.AddRange(r)));
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
而每个后台工作者都有一个这样的代码:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
CheckList(l1);
}
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
CheckList(l2);
}
private void backgroundWorker3_DoWork(object sender, DoWorkEventArgs e)
{
CheckList(l3);
}
private void backgroundWorker4_DoWork(object sender, DoWorkEventArgs e)
{
CheckList(l4);
}
我已经调试了一些,但我无法找出后台工作人员多次执行该工作的原因。有什么冲突或我做错了什么吗?谢谢。
我使用的示例文件:
danbilzerian
dailywatch
fitness
fitspo
bodyofrachael
这是 5 个条目,后台工作人员多次完成一些工作,最终看起来像这样:
问题出在 CheckList 方法中。
第一个循环的目的是什么?
您在第一个循环中循环 "names",然后在 foreach 中循环。
由于您没有使用 i 计数器,因此第一个循环似乎没有用。
BackgroundWorker 事件不会被执行超过一次,为了确保这一点,只需在 DoWork 事件中为每个事件使用 Console.WriteLine("BackGroundWork 1 Started");
并检查"Output" Window.