2

我们正在为我们的内部会计软件包系统编写一个文本编辑器之类的工具,它具有可以通过我们自己的 Xml 语言规范完成的操作。这些宏命令是在 Xml 文件中指定的,我们需要能够监控打开的文件是否在外部修改了 bean。

唯一的问题是任何时候可能有 20-30 个不同路径的文件打开。在这种情况下使用多个 FileSystemWatchers 会更好吗?或者监视根驱动器并捕获与编辑器中打开的文件匹配的特定事件会更好(尽管可能会引发很多事件)。

有些是本地驱动器(C、D、E),有些是它们的网络驱动器(U、X、G、H)。文件也很厚实,大约 300-400Kb。

4

2 回答 2

1

首先几个事实

1- FileSystemWatcher 是 ReadDirectoryChanges 的包装器
2- ReadDirectoryChanges 为每次调用 ReadDirectoryChanges 创建一个内核缓冲区以缓存来自非分页池内存的事件

上面第 2 点的含义是 FileSystemWatcher 的每个实例都会从非分页池中分配内存。请记住,这是用于内核模式驱动程序等的内存,虽然它可以动态扩展,但它“硬”限制在启动时根据系统资源计算的最大大小(机器有多少内存) )。

因此,鉴于上述情况,我将考虑以下内容。

如果您期望看到的变化量。如果这很低,请使用您可以逃脱的最小缓冲区大小的多个观察者。

另外请记住,如果您决定使用大缓冲区,监视网络驱动器不支持超过 64K 的缓冲区大小,大于该大小并且您将不会收到事件。

于 2010-05-29T08:05:38.547 回答
0

我认为您几乎可以肯定需要多个观察者。s 缓冲区可能会溢出,FileSystemWatcher您可能会错过事件,否则,您可以更改缓冲区大小(使用InternalBufferSize),但最多只能达到 64KB。

但是,请注意对于网络驱动器的FileSystemWatcher使用FindFirstChangeNotification并不完全可靠(尤其是在负载较重的情况下,但也可能是其他情况),因此您必须预期并为此做好计划,您不会收到来自网络的所有事件,我的理解是如果您有多个观察者,可靠性会变得更糟。

所以总而言之,我认为你必须增加缓冲区,尽可能多地过滤,然后在不溢出缓冲区的情况下使用尽可能少的观察者,所以可能需要一些试验和错误才能让它正确.

于 2010-05-29T08:00:30.457 回答