【问题标题】:Would watching a file for changes or redundantly querying that file be more efficient?监视文件的更改或冗余查询该文件会更有效吗?
【发布时间】:2011-03-01 09:26:29
【问题描述】:

我想知道使用 FileSystemWatcher 类监视文件/目录的更改是否会占用大量内存。我正在用 C# 开发一个桌面应用程序,它将在低性能计算机上连续在后台运行,我需要一些方法来检查各种文件是否已更改。我能想到几个解决方案:

  1. 使用 FileSystemWatcher 监视目录。
  2. 在经过的时间间隔内运行定时线程并手动检查。
  3. 每次 actionhandler 线程运行时手动检查(程序偶尔会针对某个操作执行某些操作)。

有什么建议吗?

谢谢!

坏熊猫

【问题讨论】:

  • 补充:基本(虽然没有发生很多)资源负载和峰值资源负载都需要最小化。

标签: c# performance multithreading directory filesystemwatcher


【解决方案1】:

我见过一些程序在每次程序重新获得焦点时手动检查文件/目录的更改。如果您的程序满足一些要求,这可能是合适的:

  1. 您的程序通常会长时间处于非活动状态(即处于无需了解文件更改的状态)。
  2. 在程序处于活动状态时文件/目录不太可能更改(程序本身除外,不需要通知)。
  3. 您只关心少数文件。

即便如此,FileSystemWatcher 在这种情况下也可以。

【讨论】:

    【解决方案2】:

    在我目前(全国范围)从事的大型文件传输项目中,FileSystemWatcher 是一种单向选项(对文件锁定、事件队列等进行一些管理)。在使用底层操作系统结构(提供所有这些基于事件的交互)方面,你有很多优势,我认为否则你不会实现如此高效的行为。

    【讨论】:

      【解决方案3】:

      您想选择FileSystemWatcher。这就是这个对象的设计目的。它已被开发并经过测试以广泛使用。您编写的任何内容都不会受到它所拥有的测试和优化的审查。没有必要重新发明轮子。

      【讨论】:

      【解决方案4】:

      我使用 FileSystemWatcher 类来监视数百个目录中的 *.txt 文件更改,没有性能问题。所以我想这是最好的解决方案。

      【讨论】:

        【解决方案5】:

        基于事件的总是比使用相同的轮询或产生新线程更有效,因此使用 FileSystemWatcher 是正确的想法。在我看来,使用委托的编程模型也更优雅。

        【讨论】:

        • 是的,但不要忘记在使用 FileSystemWatcher 时某些事件可能会漏掉(请参阅msdn.microsoft.com/en-us/library/…:“如果短时间内有很多更改,缓冲区可能会溢出”)。如果您想确保不会错过任何事情,您将不得不进行额外的轮询(以低速率)。
        • 另请注意,在您的代码中没有办法避免这种溢出行为;它是一个缓冲区,与您创建的 FileSystemWatcher 的属性没有任何关系。短时间内的大量更改(我们已经看到它只有 150 个文件粘贴/复制)将导致错过事件,而不会通知错过事件。
        • 嗯。我知道缓冲区溢出问题并且不担心有两个原因:第一个是这个目录发生超过 150 次更改的可能性非常小(我会说这是一年一次的情况)。第二个是我编写的代码只需要知道发生了变化;无论如何都需要对结果进行更多过滤,因此只要处理缓冲区溢出,我认为这不会成为问题。
        • *在对 OnChange 处理程序的调用之间发生超过 150 次更改的可能性非常小。
        • @badpanda:我认为缓冲区溢出是一种极端情况。我们从未有过如此极端的东西,听起来你也没有。
        猜你喜欢
        • 1970-01-01
        • 2021-08-18
        • 1970-01-01
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多