【问题标题】:Multi threading directory.getfiles with lambda expression带有 lambda 表达式的多线程 directory.getfiles
【发布时间】:2015-02-26 17:00:56
【问题描述】:
  1. 我在 c# windows 服务中有两个线程,时间流逝
  2. 当时间触发两个线程同时启动从同一文件夹上的网络服务器获取文件时
  3. 与 thread1 和 thread2 的唯一区别是文件大小,thread1 占用小于 10mb 的任何文件,thread2 占用大于 5mb 的文件。
  4. 所以我的问题是,使用Directory.GetFilesDirectory.EnumerateFiles 是否会与未找到的异常文件冲突,因为我在日志中看到了该错误?

线程1:

foreach (var file in
    Directory
        .EnumerateFiles(serverConfig["stagingFolder"])
        .Select(s => new FileInfo(s))
        .Where(s =>
            !s.Name.StartsWith(".")
            && !s.Name.EndsWith(".tmp")
            && !s.Name.EndsWith(".stdf.gz")
            && s.Length < size))

线程2

foreach (string file in
    Directory
        .EnumerateFiles(serverConfig["stagingFolder"], "*", SearchOption.TopDirectoryOnly)
        .Where(s =>
            !new FileInfo(s).Name.StartsWith(".")
            && !s.EndsWith(".tmp")
            && !s.EndsWith(".stdf.gz")
            && new FileInfo(s.ToString()).Length > size))

【问题讨论】:

  • 你为什么使用两个线程?为什么没有一个?为什么不多呢?

标签: c# multithreading lambda


【解决方案1】:

根据docs,EnumerateFiles 不会因 FileNotFound 异常而失败。所以它是另一部分,您在其中构造 FileInfo 对象。您是否尝试过打印路径和 CWD,以便验证完整路径是否存在?也许您需要将该文件称为new FileInfo(serverConfig["stagingFolder"] + Path.PathSeparator + s)

为了回答您的其他问题,EnumerateFiles 应该是线程安全的。文档没有明确说明,但没有理由假设 EnumerateFiles 函数调用彼此共享隐藏状态。

【讨论】:

  • 当我以这种方式使用你的方法 foreach (var file in Directory.EnumerateFiles(new FileInfo(serverConfig["stagingFolder"] + Path.PathSeparator + s) 你能给我工作循环吗,因为我是 C# 的新手
  • 只需更改 FileInfo 构造函数的参数。您的版本已包含 s,因此不应超出范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多