为了账号安全,请及时绑定邮箱和手机立即绑定

FileSystemWatcher vs polling监视文件更改

FileSystemWatcher vs polling监视文件更改

紫衣仙女 2019-12-22 20:12:44
FileSystemWatcher vs polling监视文件更改我需要设置一个应用程序来监视在本地或网络驱动器上的目录中创建的文件。请问FileSystemWatcher一个计时器或投票将是最好的选择。我过去曾使用过这两种方法,但并不广泛。两种方法都存在哪些问题(性能,可靠性等)?
查看完整描述

2 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

我遇到的最大问题是当缓冲区满了时丢失文件。很容易修复 - 只需增加缓冲区。请记住,它包含文件名和事件,因此请将其增加到预期的文件数量(试用和错误)。它确实使用了无法分页的内存,因此如果内存不足,它可能会强制其他进程进行分页。

这是关于缓冲区的MSDN文章: FileSystemWatcher .. ::。InternalBufferSize属性

每个MSDN:

增加缓冲区大小是昂贵的,因为它来自无法换出到磁盘的非分页内存,因此请尽可能减小缓冲区。要避免缓冲区溢出,请使用NotifyFilter和IncludeSubdirectories属性过滤掉不需要的更改通知。

由于一次预计会有大量批次,我们使用16MB。工作正常,永远不会错过文件。

我们还在开始处理之前读取了所有文件,即使只有一个......将文件名安全地缓存(在我们的例子中,放入数据库表中)然后处理它们。

对于文件锁定问题,我产生了一个进程,它等待文件解锁等待一秒钟,然后是两秒钟,然后是四个等等。我们从不投票。这已经生产了大约两年没有错误。



查看完整回答
反对 回复 2019-12-23
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

FileSystemWatcher也可能错过在繁忙时间的变化,如果排队改变的次数溢出提供的缓冲液中。这不是.NET类本身的限制,而是基础Win32基础结构的限制。根据我们的经验,最小化此问题的最佳方法是尽快将通知出列并在另一个线程上处理它们。

如上面的@ChillTemp所述,观察者可能无法处理非Windows共享。例如,它在安装的Novell驱动器上根本不起作用。

我同意一个很好的折衷方案是偶尔进行民意调查,以便找出任何错过的变化。



查看完整回答
反对 回复 2019-12-23
  • 2 回答
  • 0 关注
  • 377 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信