在背景工作者的事件中,我正在调用这种方法:
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方法内部报告进展?
答案 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);
});
}