|
1
|
| Manish Basantani · 技术社区 · 16 年前 |
|
1
1
使FileSystemWatcher工作的底层Windows API是 ReadDirectoryChangesW() . 注意第二个参数lpBuffer。这是与内部缓冲区的一对一匹配,可以使用InternalBufferSize属性设置其大小。 需要缓冲区,因为Windows无法轻松运行用户代码以响应目录更改。这些更改由相应的文件系统驱动程序检测,它们在内核模式下运行。运行用户模式代码需要一个昂贵的模式开关和线程上下文开关,对于每个检测到的更改来说,这样做太昂贵了。缓冲区用于收集更改,等待用户模式代码开始运行并清空缓冲区。 FSW有一个记录良好的故障模式,可能有太多的更改无法跟上。您将在托管代码中看到错误事件。增加缓冲区大小会有很大帮助,默认缓冲区非常小,只有4096字节。但是,将其设置为任意大并不是一个好主意,内核中还需要缓冲区空间,这是从内核内存池中获取的。这是一个有限的资源,从池中大量吞食会影响机器上运行的所有程序。 |
|
|
2
2
我认为你的问题没有抓住缓冲区的重点。 从…起 MSDN, FileSystemWatcher (我的重点):
因此,它不是一个尚未告诉您的事件缓冲区,而是它为windows提供的一个缓冲区,它首先支持通知,而无需轮询。如果Windows在此实例上抛出大量操作,此缓冲区将溢出,而您(FileSystemWatcher的使用者/用户)将丢失一些通知。 |
|
|
3
1
当filewatcher不能同时处理所有请求时,它将不得不缓冲请求,这主要是由于您编写的代码对FileSystemwatcher抛出的事件做出反应所致。据我所知,FileSystemWatcher事件不是异步的,但是您可以在事件中生成线程,以使代码的处理是异步的。当然,文件系统可以一次性更改多个文件,如删除所有文件或考虑复制粘贴。
|
|
|
4
0
是的,FileSystemWatcher用于跟踪文件系统中的更改。它监视目录并报告对目录中任何文件的以下更改:
“内部缓冲区”是操作系统向FileSystemWatcher发送信息的方式。其大小由“InternalBufferSize”属性控制。 如果一次发生太多更改,内部缓冲区可能会被填满。然后,您将收到单个更改通知,而不是获取所有单个更改:
FileSystemWatcher不会异步触发事件。具体来说,只要文件发生更改,就会触发该事件。 |