【问题标题】:C#/WPF Overusing FileSystemWatcher?C#/WPF 过度使用 FileSystemWatcher?
【发布时间】:2017-08-02 15:26:17
【问题描述】:

我正在创建一个简单的应用程序,用户可以在其中录制和播放 电视节目,其中包含 SeasonsEpisodes现有文件夹系统已存在于用户计算机上。 我想监视实际文件/文件夹是否有任何更改,因此我想在每个季节存储FileSystemWatcher 的实例,以侦听相应文件夹中可能发生的任何更改。根据每个 Shows 上的 Seasons 数量,最多可以同时收听 1000 个事件。是否有任何我应该注意的性能/不稳定问题?

here 的答案之一表明将听众的数量增加到 10,000 绝对是一个问题,但由于我不希望有很多记录我可能会使用这个答案 here 说一般事件对性能的影响并没有那么大。关于应该有多少听众同时处于活动状态,是否有某种经验法则?非常感谢任何建议。

【问题讨论】:

  • 可以使用 FileSystemWatcher.IncludeSubdirectories 减少数量吗?
  • 第二个链接“事件的性能影响”与操作系统无关,更不用说FSW了

标签: c# events filesystemwatcher event-listener


【解决方案1】:

操作

所以我想在每个季节都存储一个 FileSystemWatcher 的实例,以监听相应文件夹中可能发生的任何变化

你可以这样做,但为什么你只能拥有多个:

您可以观察指定目录的文件和子目录的变化 - MSDN

例如

myMonitor.IncludeSubdirectories = true;

操作

是否有任何我应该注意的性能/不稳定问题?

可能,但如果您只使用一个,它会减少可能性而不减少功能。

无论如何,问题不在于听众的数量(确实如此,但另一页进入了那个),而在于 FSW 不能保证它不会错过大量磁盘活动期间的事件

MSDN:

Windows 操作系统会通知您的组件有关 FileSystemWatcher 创建的缓冲区中的文件更改。 如果短时间内有很多变化,缓冲区可能会溢出。这会导致组件丢失对目录中的更改的跟踪,并且它只会提供一揽子通知。使用 InternalBufferSize 属性增加缓冲区的大小是昂贵的,因为它来自无法换出到磁盘的非分页内存,因此请保持缓冲区小而大,以免错过任何文件更改事件。为避免缓冲区溢出,请使用 NotifyFilter 和 IncludeSubdirectories 属性,以便过滤掉不需要的更改通知。 Tell me more

【讨论】:

  • 嗯,我的问题是这些季节的文件夹可以在任何地方,它们没有连接,所以它们都有不同的路径。
  • @rTECH "...预先存在的文件夹层次结构的哪一部分已经存在..."我弄错了吗?
  • 对不起,这确实是误导!我指的是用户计算机上的文件夹系统,例如在他们的硬盘上。我相应地编辑了我的问题,感谢您指出这一点。
  • @rTECH 最坏的情况是每个文件夹都有一个 FSW 来监听事件。观察者越多,磁盘活动越多,由于缓冲区溢出而错过事件的可能性就越大。 NTFS 不像 OSX 的 Journal 以及 Time Machine 的运作方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多