我的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
答案 0 :(得分:4)
对于如此庞大的工作量,您可能希望选择“定期扫描”方法而不是即时通知。例如,您可以每隔5秒扫描一次目录并处理添加的文件。如果在处理文件后将文件移动到另一个目录,则定期工作负载可能会变得极小。
这也是一种更安全的方法,因为即使您的处理代码崩溃,您也可以随时恢复,与通知不同,您的检查点不会丢失。
答案 1 :(得分:2)
您可以将缓冲区设置为4 KB或更大,但不能超过64 KB。如果尝试将InternalBufferSize属性设置为小于4096字节,则会丢弃您的值,并将InternalBufferSize属性设置为4096字节。为获得最佳性能,请在基于Intel的计算机上使用4 KB的倍数。