代码之家  ›  专栏  ›  技术社区  ›  Manish Basantani

InternalBuffer在.net FileWatcher中的角色是什么

  •  1
  • Manish Basantani  · 技术社区  · 16 年前

    通过使用google,我了解到“它用于跟踪文件系统的操作”。但我不理解它的实用性,观察者可以直接触发事件,而无需将其存储在中间缓冲区中!!

    有人能解释一下吗?

    4 回复  |  直到 16 年前
        1
  •  1
  •   Hans Passant    16 年前

    使FileSystemWatcher工作的底层Windows API是 ReadDirectoryChangesW() . 注意第二个参数lpBuffer。这是与内部缓冲区的一对一匹配,可以使用InternalBufferSize属性设置其大小。

    需要缓冲区,因为Windows无法轻松运行用户代码以响应目录更改。这些更改由相应的文件系统驱动程序检测,它们在内核模式下运行。运行用户模式代码需要一个昂贵的模式开关和线程上下文开关,对于每个检测到的更改来说,这样做太昂贵了。缓冲区用于收集更改,等待用户模式代码开始运行并清空缓冲区。

    FSW有一个记录良好的故障模式,可能有太多的更改无法跟上。您将在托管代码中看到错误事件。增加缓冲区大小会有很大帮助,默认缓冲区非常小,只有4096字节。但是,将其设置为任意大并不是一个好主意,内核中还需要缓冲区空间,这是从内核内存池中获取的。这是一个有限的资源,从池中大量吞食会影响机器上运行的所有程序。

        2
  •  2
  •   Benjamin Podszun    16 年前

    我认为你的问题没有抓住缓冲区的重点。

    从…起 MSDN, FileSystemWatcher (我的重点):

    由创建的缓冲区中的更改 文件系统监视程序 在短时间内改变,缓冲区 可以溢出。这导致了 组件无法跟踪中的更改 提供全面通知。

    因此,它不是一个尚未告诉您的事件缓冲区,而是它为windows提供的一个缓冲区,它首先支持通知,而无需轮询。如果Windows在此实例上抛出大量操作,此缓冲区将溢出,而您(FileSystemWatcher的使用者/用户)将丢失一些通知。

        3
  •  1
  •   chrissie1    16 年前

    当filewatcher不能同时处理所有请求时,它将不得不缓冲请求,这主要是由于您编写的代码对FileSystemwatcher抛出的事件做出反应所致。据我所知,FileSystemWatcher事件不是异步的,但是您可以在事件中生成线程,以使代码的处理是异步的。当然,文件系统可以一次性更改多个文件,如删除所有文件或考虑复制粘贴。

        4
  •  0
  •   RobC    16 年前

    是的,FileSystemWatcher用于跟踪文件系统中的更改。它监视目录并报告对目录中任何文件的以下更改:

    • OnCreated:在创建文件或目录时调用
    • OnChanged:当文件或目录发生更改时调用
    • OnRename:重命名文件或目录时调用
    • OnDeleted:删除文件或目录时调用

    “内部缓冲区”是操作系统向FileSystemWatcher发送信息的方式。其大小由“InternalBufferSize”属性控制。

    如果一次发生太多更改,内部缓冲区可能会被填满。然后,您将收到单个更改通知,而不是获取所有单个更改:

    • OneError:当单个更改由于缓冲区溢出而丢失时调用

    FileSystemWatcher不会异步触发事件。具体来说,只要文件发生更改,就会触发该事件。

    推荐文章