C#中的BackgroundWorker运行多次

时间:2015-08-09 07:16:03

标签: c# multithreading backgroundworker

我正在编写一个执行特定任务的程序(检查某些内容),当我使用后台工作程序(多个)时,它们会执行多次。我只希望他们执行一次。

我有一个按钮,代码如下:

    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个条目,后台工作人员多次完成一些工作,最终看起来像这样:

enter image description here

1 个答案:

答案 0 :(得分:5)

问题出在 CheckList 方法。

第一个循环的目的是什么?

你在第一个循环中循环“名称”,然后在foreach中循环遍历它。

由于你没有使用 i 计数器,似乎第一个循环没用。

BackgroundWorker事件没有多次执行,为了确保这一点,只需在DoWork Events中为每一个使用Console.WriteLine("BackGroundWork 1 Started");并检查“输出“窗口。