c# - FileSystemWatcher InternalBufferOverflow

标签 c# windows-server-2008 filesystemwatcher buffer-overflow microsoft-distributed-file-system

当我尝试监视网络路径上的文件夹(DFS - 分布式文件系统)时出现异常 System.IO.Internal.BufferOverflowException: To many changes at once 。当 FileSystemWatcher 正在监视不使用此文件系统的本地/网络路径时,它工作正常。

我能够从本地路径上的 1000 多个文件中获取一个事件,并且我没有收到 BufferOverflow 异常,但是当我将文件复制到 DFS 上的文件夹时,我什至无法从一个(到澄清这一点,我收到了一个错误事件...)。

我已经尝试设置:

fileSystemWatcher.InternalBufferSize = 65536;

我不确定这是否对您有帮助,但路径如下所示:

\\corpnet\cloud\\Network\testFolder\myFolderToMonitor

编辑:1 我不确定为什么路径中有两个双斜杠。我可以毫无问题地监视文件夹,直到 \corpnet\cloud 路径。一旦我尝试监视任何从

开始的文件夹,我就会收到错误
...\\Network\...

感谢您的任何提示。

谢谢

最佳答案

当然,一次更改太多,这是一个firehose 问题。您已经将缓冲区大小增加到允许的最大值,Windows 不允许更大的缓冲区。它分配在“宝贵”的内存中,即内核内存池。

可能是一个高度活跃的文件服务器,但更常见的是,这是由您的代码中的问题引起的。你从消防水带喝水的速度不够快。您的事件处理程序必须尽快返回,以便足够快地清空缓冲区并跟上文件服务器上的更改速度。

这通常是错误的,典型的实现会做一些不明智的事情,比如复制文件、读取文件、循环直到文件可以打开。昂贵的东西,循环错误是一个非常常见的错误,当事件触发时文件很少可用,因为更改文件的任何应用程序仍然打开它。锁定文件的时间也没有上限。显然,这总是会导致缓冲区溢出。

因此,正确实现的 FileSystemWatcher 事件处理程序除了快速将传递的文件路径放入线程安全队列之外什么都不做,而不会做任何其他事情,这永远不会超过一微秒。并使用另一个线程尝试再次清空该队列,以处理文件尚未打开的可能性。

关于c# - FileSystemWatcher InternalBufferOverflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22116374/

相关文章:

c# - 对多个文件使用 FileSystemWatcher

c# - Moq - 设置模拟到第一次回调和第二次引发事件

c# - 为什么 Exception 是一个类,而不是一个结构?

windows-server-2008 - 一个进程在 Windows 中崩溃了 .. 崩溃转储位置

java - 该错误与操作系统或数据库有关吗?

c# - FileSystemWatcher 无法访问文件,因为已在其他进程中使用

c# - 如何在 WebApi 中使用多个 GET 操作?

c# - ITextSharp 将文本插入现有的 pdf

powershell - 在 Powershell 中使用自定义用户文件夹创建本地用户

rust - Rust 中的文件系统监视