FileSystemWatcher InternalBufferSize的理想大小是多少?

时间:2012-03-16 14:55:26

标签: c# buffer filesystemwatcher

我的FileSystemWatcher存在问题。

我的应用程序需要在短时间内监控文件夹中创建的文件数量非常大,非常好。

当我开始开发它时,我意识到很多文件没有得到通知,如果我的缓冲区小于64kb,这是微软推荐的。我尝试增加缓冲区大小,直到我达到一个对我有用的值,即2621440字节!

你建议在这种情况下使用小尺寸,或者理想的缓冲尺寸是什么?

我的示例代码:

WATCHER = new FileSystemWatcher(SignerDocument.UnsignedPath, "*.pdf");
WATCHER.InternalBufferSize = 2621440; //Great and expensive buffer 2.5mb size!
WATCHER.IncludeSubdirectories = true;
WATCHER.EnableRaisingEvents = true;
WATCHER.Created += new FileSystemEventHandler(watcher_Created);
WATCHER.Renamed += new RenamedEventHandler(watcher_Renamed);

微软在.NET 2.0中对此有何看法:

  

增加缓冲区大小非常昂贵,因为它来自非分页内存   无法换出磁盘,所以保持缓冲区尽可能小   可能。要避免缓冲区溢出,请使用NotifyFilter和   IncludeSubdirectories属性可过滤掉不需要的更改   通知。   链接:FileSystemWatcher.InternalBufferSize Property

2 个答案:

答案 0 :(得分:4)

对于如此庞大的工作量,您可能希望选择“定期扫描”方法而不是即时通知。例如,您可以每隔5秒扫描一次目录并处理添加的文件。如果在处理文件后将文件移动到另一个目录,则定期工作负载可能会变得极小。

这也是一种更安全的方法,因为即使您的处理代码崩溃,您也可以随时恢复,与通知不同,您的检查点不会丢失。

答案 1 :(得分:2)

您可以将缓冲区设置为4 KB或更大,但不能超过64 KB。如果尝试将InternalBufferSize属性设置为小于4096字节,则会丢弃您的值,并将InternalBufferSize属性设置为4096字节。为获得最佳性能,请在基于Intel的计算机上使用4 KB的倍数。

自: http://msdn.microsoft.com/de-de/library/system.io.filesystemwatcher.internalbuffersize(v=vs.110).aspx