2 回答
TA贡献1893条经验 获得超10个赞
我遇到的最大问题是当缓冲区满了时丢失文件。很容易修复 - 只需增加缓冲区。请记住,它包含文件名和事件,因此请将其增加到预期的文件数量(试用和错误)。它确实使用了无法分页的内存,因此如果内存不足,它可能会强制其他进程进行分页。
这是关于缓冲区的MSDN文章: FileSystemWatcher .. ::。InternalBufferSize属性
每个MSDN:
增加缓冲区大小是昂贵的,因为它来自无法换出到磁盘的非分页内存,因此请尽可能减小缓冲区。要避免缓冲区溢出,请使用NotifyFilter和IncludeSubdirectories属性过滤掉不需要的更改通知。
由于一次预计会有大量批次,我们使用16MB。工作正常,永远不会错过文件。
我们还在开始处理之前读取了所有文件,即使只有一个......将文件名安全地缓存(在我们的例子中,放入数据库表中)然后处理它们。
对于文件锁定问题,我产生了一个进程,它等待文件解锁等待一秒钟,然后是两秒钟,然后是四个等等。我们从不投票。这已经生产了大约两年没有错误。
TA贡献1825条经验 获得超6个赞
的FileSystemWatcher
也可能错过在繁忙时间的变化,如果排队改变的次数溢出提供的缓冲液中。这不是.NET类本身的限制,而是基础Win32基础结构的限制。根据我们的经验,最小化此问题的最佳方法是尽快将通知出列并在另一个线程上处理它们。
如上面的@ChillTemp所述,观察者可能无法处理非Windows共享。例如,它在安装的Novell驱动器上根本不起作用。
我同意一个很好的折衷方案是偶尔进行民意调查,以便找出任何错过的变化。
添加回答
举报