在 C# 使用 Directory.GetFiles() 中,是否有一种方法可以在找到文件时启动线程而不必等待?
在 C# 使用 Directory.GetFiles() 中,有没有办法在找到文件时启动线程?
该行为似乎是“查找所有文件”,然后对每个文件执行您需要的操作。是否还有另一个类允许在找到文件时启动线程(最多一定数量)?
In C# Using Directory.GetFiles(), is there a way to start threads as files are found?
The behavior appears to be 'find all the files' then do what you need on each. Is there another class that allows one to start threads (up to a certain count) as files are found?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您需要调用
Directory.EnumerateFiles
,这是 .Net 4.0 的新增内容。该方法返回一个惰性枚举;每次调用
MoveNext()
时,它都会在文件系统中查询下一个文件。你可以像这样启动你的线程:
临时变量是确保每个委托闭包引用一个单独的变量所必需的;否则,它们都会共享相同的值,从而造成麻烦。
You need to call
Directory.EnumerateFiles
, which is new to .Net 4.0.This method returns a lazy enumerable; each time you call
MoveNext()
, it will query the filesystem for the next file.You can start your threads like this:
The temporary variable is necessary to ensure that each delegate closure references a separate variable; otherwise, they would all share the same value, causing trouble.
SLAks 已经针对 .NET 4.0 回答了这个问题。但是,如果您在 4.0 之前的项目中绝对需要这种行为,那么您当然可以始终使用 FindFirstFile 和 FindNextFile 执行 PInvoke。它们在每个文件之后返回(正如名称所暗示的那样)。
pinvoke.net 上有一个 示例。
SLaks has answered this for .NET 4.0. Buf if you absolutely need this behavior in a pre-4.0 project, you can of course always do a PInvoke, using FindFirstFile and FindNextFile. They return after each file (as the names imply).
There is an example on pinvoke.net.