系统如何.IO.FileSystemWatcher在引擎盖下工作



我想了解System是如何做到的。IO.FileSystemWatcher在引擎盖下工作?因为我有一个要求,我需要查看100个或更多文件夹下的所有文件,每个文件夹将有大约1K个文件。

我不确定如果我使用FileSystemwatcher,它是否会创建许多线程来监视这些文件,这会影响我的应用程序的性能?所以你能告诉我系统的具体情况吗。IO.FileSystemWatcher是在后台工作,还是在内部使用线程来监视这些目录?

内部FileSystemWatcher使用Windows APIReadDirectoryChangesW函数(可以从FileSystemWatcher参考源中看到(。ReadDirectoryChangesW的底层实现没有文档记录,但为了回答您关于FileSystemWatcher是否创建单独的线程来监视文件的特定问题,答案是";否";。

然而,鉴于您的目录包含许多文件,因此值得从文档中关于FileSystemWatcher的注释中强调以下内容:

Windows操作系统会通知您的组件FileSystemWatcher创建的缓冲区中的文件更改。如果在短时间内有许多更改,缓冲区可能会溢出。这会导致组件丢失对目录中更改的跟踪,并且只提供一揽子通知。使用InternalBufferSize属性增加缓冲区的大小是昂贵的,因为它来自无法交换到磁盘的非分页内存,因此请保持缓冲区足够小但足够大,以免错过任何文件更改事件。为了避免缓冲区溢出,请使用NotifyFilter和IncludeSubdirectories属性,以便过滤掉不需要的更改通知。

有两个收获:

  1. 对于许多FileSystemWatcher实例,将创建许多缓冲区来存储更改事件,这些缓冲区是从非分页内存中分配的,而非分页内存是一种有限的资源
  2. 如果您正在监视的目录中发生了大量更改,则可能会错过事件

最新更新