【问题标题】:How can i make that the backgroundworker will report the progress items only once?我怎样才能让后台工作人员只报告一次进度项目?
【发布时间】:2016-07-04 06:54:51
【问题描述】:
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;
}

这一行将文件结果添加到列表视图中

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

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

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    如果没有一个好的Minimal, Complete, and Verifiable code example 可以清楚地显示您的代码现在做什么,以及您希望它做什么的精确描述,那么即使不是不可能,也很难确定您想要什么。

    但是如果我正确理解了这个问题,解决方案就像维护一个标志一样简单,该标志指示您是否已报告当前文件,并且仅在尚未设置该标志时才报告该文件。例如:

    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&lt;MyProgress&gt;ReportProgress() 方法传递信息。该列表中只有一个元素,因此您最好只传递 MyProgress 值本身,而不是包含该值的列表。

    如果以上内容不能解决您的问题,请改进问题,使其更易于理解。

    【讨论】:

    • Peter 和 MyProgress 列表你是说我应该是这样的: MyProgress myp = new MyProgress();然后例如 myp.Report1 = file;和 teportprogress myp ?
    • 是的,这就是我的意思。然后在您的处理程序中,您可以直接转换回MyProgress,即MyProgress mypro = (MyProgress)e.UserState;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多