在 C# 使用 Directory.GetFiles() 中,是否有一种方法可以在找到文件时启动线程而不必等待?

发布于 2024-09-28 13:02:04 字数 123 浏览 3 评论 0原文

在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

憧憬巴黎街头的黎明 2024-10-05 13:02:04

您需要调用 Directory.EnumerateFiles,这是 .Net 4.0 的新增内容。

该方法返回一个惰性枚举;每次调用 MoveNext() 时,它都会在文件系统中查询下一个文件。

你可以像这样启动你的线程:

foreach(var dontUse in Directory.EnumerateFiles(...)) {
    string path = dontUse;  //Create a new variable for each closure
    ThreadPool.QueueUserWorkItem(delegate {
        ...
    });
}

临时变量是确保每个委托闭包引用一个单独的变量所必需的;否则,它们都会共享相同的值,从而造成麻烦。

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:

foreach(var dontUse in Directory.EnumerateFiles(...)) {
    string path = dontUse;  //Create a new variable for each closure
    ThreadPool.QueueUserWorkItem(delegate {
        ...
    });
}

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.

白日梦 2024-10-05 13:02:04

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文