FileSystemWatcher InternalBufferOverflow

war*_*cik 2 c# filesystemwatcher buffer-overflow microsoft-distributed-file-system windows-server-2008

当我尝试监视网络路径上的文件夹(DFS - 分布式文件系统)时,我收到异常System.IO.Internal.BufferOverflowException:一次更改许多更改.当FileSystemWatcher监视不使用此文件系统的本地/网络路径时,它可以正常工作.

我能够从本地路径上的1000 +文件中获取一个事件而我没有得到BufferOverflow异常,但是当我将文件复制到DFS上的文件夹时,我甚至无法从一个文件中获取事件(为了澄清这一点,我收到了错误事件...).

我已经尝试过设置:

fileSystemWatcher.InternalBufferSize = 65536;
Run Code Online (Sandbox Code Playgroud)

我不确定这是否会对你有所帮助,但路径看起来像这样:

\\corpnet\cloud\\Network\testFolder\myFolderToMonitor
Run Code Online (Sandbox Code Playgroud)

编辑:1我不知道为什么路径中有两个双斜杠.我可以在没有问题文件夹的情况下进行监控,直到\ corpnet\cloud路径.一旦我试图监视任何开始的文件夹,我就会收到错误

...\\Network\...
Run Code Online (Sandbox Code Playgroud)

你的任何提示都表示赞赏.

谢谢

Han*_*ant 5

当然,一次变化太多,这是一个消防问题.您已经将缓冲区大小增加到允许的最大值,Windows不允许更大的缓冲区大小.它被分配在"珍贵"的内存中,即内核内存池.

可能是一个高度活跃的文件服务器,但更常见的是这是由代码中的问题引起的.你不能快速地从消防水中喝水.您的事件处理程序必须尽快返回,以便缓冲区足够快地清空,并且可以跟上文件服务器上的更改速率.

这通常是摸索,一个典型的实现做一些不明智的事情,如复制文件,读取它,循环直到文件可以打开.昂贵的东西,循环错误是一个非常常见的错误,当事件触发时文件很少可用,因为任何更改文件的应用程序仍然打开它.它可以保持对文件的锁定时间没有上限.显然,这将总是导致缓冲区溢出.

因此,正确实现的FileSystemWatcher事件处理程序除了快速将传递的文件路径放入线程安全队列之外什么都不做,并且不执行任何其他操作,从不应该花费超过一微秒.并使用另一个线程再次尝试清空该队列,处理文件无法打开的可能性.