c# – 如何在完成之前访问DirectoryInfo.EnumerateFiles
在问我
Retrieve a list of filenames in folder and all subfolders quickly和其他一些我发现的问题中,搜索许多文件的方法似乎是使用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(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |