通过做一些谷歌,我知道“它是用来跟踪文件系统动作”的。但是我不理解它的功能,观察者可以直接触发事件,而无需将其存储在中间缓冲区中!
是否可以将异步事件流(复制/修改文件)转换为同步事件调用?另外,我不确定FileWatcher是否异步触发事件。
有人可以对此进行说明吗?
最佳答案
使FileSystemWatcher起作用的基础Windows API是ReadDirectoryChangesW()。注意第二个参数lpBuffer。这与内部缓冲区一对一匹配,您可以使用InternalBufferSize属性设置其大小。
由于Windows无法轻松响应目录更改而运行用户代码,因此需要缓冲区。这些更改由各自的文件系统驱动程序检测到,它们以内核模式运行。运行用户模式代码需要昂贵的模式切换和线程上下文切换,对于每个检测到的单独更改而言,这样做太昂贵了。缓冲区在那里收集更改,等待用户模式代码开始运行并清空缓冲区。
FSW的故障模式有据可查,可能有太多更改无法跟上。您会在托管代码中看到Error事件。增加缓冲区的大小可以帮助很多,默认缓冲区很小,只有4096字节。但是,使其任意大都不是一个好主意,内核中还需要缓冲区空间,而缓冲区空间是从内核内存池中获取的。那是有限的资源,从池中掠夺大量资源会影响计算机上运行的所有程序。
关于c# - .NET FileWatcher中InternalBuffer的作用是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2182782/