在我问Retrieve a list of filenames in folder and all subfolders quickly的问题中,我发现了一些其他问题,看来搜索许多文件的方法是使用EnumerateFiles方法。


  EnumerateFiles和GetFiles方法的区别如下:
  使用EnumerateFiles,您可以开始枚举名称集合
  在归还全部收藏品之前;当您使用GetFiles时,您
  必须等待返回整个名称数组,然后才能
  访问数组。因此,当您处理许多文件时,
  目录,EnumerateFiles可以更有效。


这对我来说听起来很棒,我的搜索大约需要10秒钟,因此随着信息的进入,我可以开始确定我的列表。但是我无法弄清楚。当我运行EnumerateFiles方法时,应用程序将冻结直到完成。我可以在后台工作程序中运行它,但是该线程也会发生同样的事情。有什么帮助吗?

 DirectoryInfo dir = new DirectoryInfo(MainFolder);
 List<FileInfo> matches = new List<FileInfo>(dir.EnumerateFiles("*.docx",SearchOption.AllDirectories));

//This wont fire until after the entire collection is complete
DoSoemthingWhileWaiting();

最佳答案

您可以通过将其推入后台任务来执行此操作。

例如,您可以这样做:

var fileTask = Task.Factory.StartNew( () =>
{
    DirectoryInfo dir = new DirectoryInfo(MainFolder);
    return new List<FileInfo>(
           dir.EnumerateFiles("*.docx",SearchOption.AllDirectories)
           .Take(200) // In previous question, you mentioned only wanting 200 items
       );
};

// To process items:
fileTask.ContinueWith( t =>
{
     List<FileInfo> files = t.Result;

     // Use the results...
     foreach(var file in files)
     {
         this.listBox.Add(file); // Whatever you want here...
     }
}, TaskScheduler.FromCurrentSynchronizationContext()); // Make sure this runs on the UI thread

DoSomethingWhileWaiting();




您在评论中提到:


  我想在列表中显示它们。并完美地将它们发送到主用户界面


在这种情况下,您必须在后台对其进行处理,然后将其添加到列表中。类似:

Task.Factory.StartNew( () =>
{
    DirectoryInfo dir = new DirectoryInfo(MainFolder);
    foreach(var tmp in dir.EnumerateFiles("*.docx",SearchOption.AllDirectories).Take(200))
    {
        string file = tmp; // Handle closure issue

        // You may want to do this in batches of >1 item...
        this.BeginInvoke( new Action(() =>
        {
             this.listBox.Add(file);
        }));
    }
});
DoSomethingWhileWaiting();

07-26 09:34