当我尝试监视网络路径上的文件夹(DFS - 分布式文件系统)时,出现 System.IO.Internal.BufferOverflowException 异常:同时进行许多更改。当 FileSystemWatcher 监视不使用此文件系统的本地/网络路径时,它工作正常。
我能够从本地路径上的 1000 多个文件中获取事件,并且没有收到 BufferOverflow 异常,但是当我将文件复制到 DFS 上的文件夹时,我什至无法从其中获取事件(为了澄清这一点,我收到一个错误事件引发...)。
我已经尝试设置:
fileSystemWatcher.InternalBufferSize = 65536;
我不确定这是否对您有帮助,但路径如下所示:
\\corpnet\cloud\\Network\testFolder\myFolderToMonitor
编辑:1
我不确定为什么路径中有两个双斜杠。我可以监控没有问题的文件夹,直到\corpnet\云小路。当我尝试监视从以下位置开始的任何文件夹时,我收到错误
...\\Network\...
您的任何提示表示赞赏。
Thanks
当然,一次改变太多,这是一个firehose问题。您已将缓冲区大小增加到允许的最大值,Windows 不允许更大的缓冲区大小。它被分配在“宝贵的”内存中,即内核内存池。
This could是一个高度活跃的文件服务器,但更常见的是,这是由代码中的问题引起的。你从消防水带里喝水的速度不够快。您的事件处理程序必须尽快返回,以便缓冲区足够快地清空并跟上文件服务器上的更改速度。
这常常是错误的,典型的实现会做一些不明智的事情,比如复制文件、读取文件、循环直到文件可以打开。昂贵的东西,循环错误是一个非常常见的错误,当事件触发时文件很少可用,因为无论更改文件的应用程序仍然将其打开。锁定文件的时间也没有上限。显然,这总是会导致缓冲区溢出。
因此,正确实现的 FileSystemWatcher 事件处理程序除了快速将传递的文件路径放入线程安全队列中之外什么也不做,并且不执行任何其他操作,这永远不应超过一微秒。并使用another线程尝试再次清空该队列,处理文件尚无法打开的可能性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)