【问题标题】:Parallel processing of Directory目录的并行处理
【发布时间】:2015-12-03 17:20:53
【问题描述】:

我正在进行文件目录监控,我必须在其中查找特定目录“D:\Watch”,如果检测到任何新文件,我必须对其进行处理并显示内容。我正在使用 FileSystemWatcher,但我的要求是每 1 分钟检查一次目录。这就是为什么我跳过 FileSystemWatcher 并创建一个每 1 分钟安排一次的 Windows 服务并读取目录以处理新文件。

但我的要求是并行读取文件并在文件处理后显示内容,不需要等待其他文件被处理。如果任何文件的内容不正确,我还需要处理异常。

我怎样才能同时完成上述要求的任务。我正在使用 C#.net。谢谢

【问题讨论】:

    标签: c# parallel-processing windows-services task-parallel-library


    【解决方案1】:

    如果我理解正确,这段代码应该适合你。

      var filePaths = Directory.EnumerateFiles(@"c:\mydir");
      Parallel.ForEach(filePaths, ProcessFile);
    

    这是你的处理逻辑

      private void ProcessFile(string filePath)
      {
          //do what you have to do here. Proper exception handling is needed in this method      
      }
    

    【讨论】:

    • 谢谢伙计。如果文件处理过程中出现任何异常,它会起作用吗?我将如何处理并行编程中的异常?
    • 在处理文件时可能会出现异常情况。 (例如:文件被锁定)。所以你需要在ProcessFile 方法中处理它们。另一种可能性是目录中有太多文件,如果您尝试在多个线程中处理所有文件,您将遇到内存/处理器使用问题。开始处理文件后立即将文件移动到另一个目录是有意义的。所以另一个线程不会接它。
    • 如果您希望此目录中有 1000 多个文件,则将文件集合划分为 10 个文件并逐个分区处理是有意义的。因此,您一次只能运行 10 个线程,而不是 1000 个线程。
    • 实际上我每 30 秒有一个 Windows 服务计划,并且目录中有任何文件会选择它来处理。它可能是 100 个文件,也可能是 1 个文件,但要求是在不冻结应用程序的情况下处理文件。那么我应该选择 Threads 还是 TPL 呢?
    • 我会使用Parallel。正如我之前所说,如果您不确定文件大小和文件数量,最好对文件集合进行分区。但是 100 个小 (~10mb) 文件应该没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 2017-01-27
    相关资源
    最近更新 更多