FileSystemWatcher 在 C# Windows 窗体中抛出 System.IO.InternalBufferOverflowException [关闭]

问题描述 投票:0回答:1

我在 C# 中创建了一个应用程序,它持续侦听文件夹中是否有新文件添加,一旦添加了新文件,它就会选择该文件并将其上传到 S3 存储桶。我用 4-5 个文件测试了应用程序,它工作得很好,但是一旦我向该文件夹添加 55 个文件,应用程序就会抛出“System.IO.InternalBufferOverflowException”错误。我该怎么做才能解决这个问题?

Screenshot

我正在考虑增加 FileSystemWatcher 的缓冲区大小,但我不太确定这是否可行。

c# .net winforms filesystemwatcher
1个回答
0
投票

InternalBufferOverflowException 状态的文档

FileSystemWatcher中,当您收到文件更改通知时,系统会将这些更改存储在组件创建的缓冲区中并传递给应用程序编程接口(API)。如果短时间内变化很多,缓冲区很容易溢出,导致抛出异常,本质上就是丢失所有变化。为了防止缓冲区溢出,请使用 FileSystemWatcher.NotifyFilterFileSystemWatcher.IncludeSubdirectories 属性来过滤掉不需要的更改通知。您还可以通过 FileSystemWatcher.InternalBufferSize 属性增加内部缓冲区的大小。然而,增加缓冲区的大小是昂贵的,所以保持缓冲区尽可能小。

因此,您可以尝试多种补救措施,而且很可能需要组合使用它们。

  1. 您应该尝试的第一组是使用
    NotifyFilter
    IncludeSubdirectories
    属性进行过滤。这些直接影响到你需要看的事件的数量和范围,所以应该先尝试这些。您可能更关心新文件的完成和创建(例如),而不是文件属性和安全性的更改。
  2. 因为事件处理是顺序的并且仅限于内部缓冲区,并且因为what你为每个事件做的是内联的,你可以卸载它。 Fildor 在您的帖子的评论中建议这样做。这是很好的第二道防线。我的建议是使用
    ConcurrentQueue
    和后台线程或任务来处理事件。
  3. 最后,您可以按照文档中的说明增加缓冲区大小。您可以点击
    InternalBufferSize
    的链接,因为他们说它很贵。不过,它“感觉”不是正确的解决方案;更大的变更集更有可能再次导致问题。
© www.soinside.com 2019 - 2024. All rights reserved.