我在 C# 中创建了一个应用程序,它持续侦听文件夹中是否有新文件添加,一旦添加了新文件,它就会选择该文件并将其上传到 S3 存储桶。我用 4-5 个文件测试了应用程序,它工作得很好,但是一旦我向该文件夹添加 55 个文件,应用程序就会抛出“System.IO.InternalBufferOverflowException”错误。我该怎么做才能解决这个问题?
我正在考虑增加 FileSystemWatcher 的缓冲区大小,但我不太确定这是否可行。
InternalBufferOverflowException 状态的文档
在FileSystemWatcher中,当您收到文件更改通知时,系统会将这些更改存储在组件创建的缓冲区中并传递给应用程序编程接口(API)。如果短时间内变化很多,缓冲区很容易溢出,导致抛出异常,本质上就是丢失所有变化。为了防止缓冲区溢出,请使用 FileSystemWatcher.NotifyFilter 和 FileSystemWatcher.IncludeSubdirectories 属性来过滤掉不需要的更改通知。您还可以通过 FileSystemWatcher.InternalBufferSize 属性增加内部缓冲区的大小。然而,增加缓冲区的大小是昂贵的,所以保持缓冲区尽可能小。
因此,您可以尝试多种补救措施,而且很可能需要组合使用它们。
NotifyFilter
和 IncludeSubdirectories
属性进行过滤。这些直接影响到你需要看的事件的数量和范围,所以应该先尝试这些。您可能更关心新文件的完成和创建(例如),而不是文件属性和安全性的更改。ConcurrentQueue
和后台线程或任务来处理事件。InternalBufferSize
的链接,因为他们说它很贵。不过,它“感觉”不是正确的解决方案;更大的变更集更有可能再次导致问题。