如何在计算文件实时计数时向用户报告?

时间:2016-03-12 03:07:43

标签: c# .net winforms

在背景工作者的事件中,我正在调用这种方法:

public List<string> FindLines(string DirName, string TextToSearch)
    {
        int counter = 0;
        List<string> findLines = new List<string>();
        DirectoryInfo di = new DirectoryInfo(DirName);
        List<FileInfo> l = new List<FileInfo>();
        backgroundWorker1.ReportProgress(0, "Counting Files");
        CountFiles(di, l);
    }

方法CountFiles:

private void CountFiles(DirectoryInfo di, List<FileInfo> l)
        {
            try
            {
                l.AddRange(di.EnumerateFiles());
            }
            catch
            {

            }

            try
            {
                IEnumerable<DirectoryInfo> subDirs = di.EnumerateDirectories();
                if (subDirs.Count() > 0)
                {
                    foreach (DirectoryInfo dir in subDirs)
                        CountFiles(dir, l);
                }
            }
            catch 
            {
                string err = "";
            }
        }

这是改进的evet:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            if (e.UserState.ToString() == "Counting Files")
                label2.Text = e.UserState.ToString();
        }

或多或少花费2-4秒来计算文件数量。在这个时候,我向用户显示它现在正在计算文件的消息但是如果我还要在label3上显示文件的实时计数我该怎么办?我想我需要以某种方式从CountFiles方法内部报告进展?

1 个答案:

答案 0 :(得分:0)

将第一个CountFiles调用更改为:

 CountFiles(di, l, count=> {
                backgroundWorker1.ReportProgress(count, "Files Found...");
            });

将CountFiles方法更改为:

 private void CountFiles(DirectoryInfo di, List<FileInfo> l, Action<int> CurrentCount) {
           ...
            foreach (DirectoryInfo dir in subDirs)
                CountFiles(dir, l, currentCount=> {
                    CurrentCount(l.Count);

                });
        }