我怎样才能让backgroundworker只报告一次进度项?

时间:2016-07-03 21:20:43

标签: c# .net winforms

foreach (string file in filePathList)
{
    try
    {
        _busy.WaitOne();
        if (worker.CancellationPending == true)
        {
            e.Cancel = true;
            return;
        }

        for (int i = 0; i < textToSearch.Length; i++)
        {
            List<MyProgress> prog = new List<MyProgress>();
            if (File.ReadAllText(file).IndexOf(textToSearch[i], StringComparison.InvariantCultureIgnoreCase) >= 0)
            {
                resultsoftextfound.Add(file + "  " + textToSearch[i]);
                numberoffiles++;
                prog.Add(new MyProgress { Report1 = file, Report2 = numberoffiles.ToString(), Report3 = textToSearch[i] });
                backgroundWorker1.ReportProgress(0, prog);
            }
        }
            numberofdirs++;
            label1.Invoke((MethodInvoker)delegate
            {
                label1.Text = numberofdirs.ToString();
                label1.Visible = true;
            });
        }
     catch (Exception)
     {
         restrictedFiles.Add(file);
         continue;
     }
}

MyProgress课程

public class MyProgress
{
    public string Report1 { get; set; }
    public string Report2 { get; set; }
    public string Report3 { get; set; }
}

在内部循环中,textToSearch包含多个项目,例如:

  

你好世界

如果同一文件中存在多于两个单词,则根据文件中找到的单词/文本数量,它将报告相同文件两次或三次。

如何让循环更多地查找文件中的文本但只报告文件一次?

此行仅报告一次。 如果在文件中找到2或3个结果仅报告一次。在许多情况下,它报告的文件是同一文件的两倍或三倍。

backgroundWorker1.ReportProgress(0, prog);

稍后在progresschanged上我将文件作为字符串添加到listView

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    List<MyProgress> mypro = e.UserState as List<MyProgress>;
    ListViewCostumControl.lvnf.Items.Add(mypro[0].Report1);
    label15.Text = mypro[0].Report2;
    label15.Visible = true;
    if (ListViewCostumControl.lvnf.Items.Count > 9)
        textBox4.Enabled = true;
}

此行将文件结果添加到listView

ListViewCostumControl.lvnf.Items.Add(mypro[0].Report1);

我不想更改循环只是为了让它在完成搜索后报告每个文件一次。

1 个答案:

答案 0 :(得分:1)

如果没有一个好的Minimal, Complete, and Verifiable code example能够清楚地显示您的代码现在所做的事情,并且准确地描述了您希望它做什么,那么即使不是不可能确定您的代码是什么也很困难想。

但如果我正确理解了这个问题,那么解决方案就像维护一个标志一样简单,该标志表明您是否报告了当前文件,并且只有在没有设置标志的情况下才报告该文件然而。 E.g:

foreach (string file in filePathList)
{
    try
    {
        _busy.WaitOne();
        if (worker.CancellationPending == true)
        {
            e.Cancel = true;
            return;
        }

        bool reportedFile = false;

        for (int i = 0; i < textToSearch.Length; i++)
        {
            List<MyProgress> prog = new List<MyProgress>();
            if (File.ReadAllText(file).IndexOf(textToSearch[i], StringComparison.InvariantCultureIgnoreCase) >= 0)
            {
                resultsoftextfound.Add(file + "  " + textToSearch[i]);

                if (!reportedFile)
                {
                    numberoffiles++;
                    prog.Add(new MyProgress { Report1 = file, Report2 = numberoffiles.ToString(), Report3 = textToSearch[i] });
                    backgroundWorker1.ReportProgress(0, prog);
                    reportedFile = true;
                }
            }
        }

        numberofdirs++;
        label1.Invoke((MethodInvoker)delegate
        {
            label1.Text = numberofdirs.ToString();
            label1.Visible = true;
        });
    }
    catch (Exception)
    {
        restrictedFiles.Add(file);
        continue;
    }
}

我还要指出,您似乎正在使用List<MyProgress>传递ReportProgress()方法的信息,这是没有充分理由的。该列表中只有一个元素,因此您也可以只传递MyProgress值本身,而不是包含该值的列表。

如果上述问题无法解决您的问题,请改进问题,以便更容易理解。