C# FileSystemWatcher工作不正常

C# FileSystemWatcher工作不正常,c#,filesystemwatcher,asynchronous,C#,Filesystemwatcher,Asynchronous,我正在使用FileSystemWatcher扫描从web应用程序上载文件的文件夹。我有1000多个文件被上传到这个文件夹。现在,问题是FileSystemWatcher是在复制第一个文件时启动的,有时,它并不适用于所有文件。任何建议都是非常值得欣赏的。文件系统观察者说(我的重点): Windows操作系统会通知组件文件更改 在FileSystemWatcher创建的缓冲区中如果有很多 在短时间内更改,缓冲区可能会溢出。这导致了 组件无法跟踪目录中的更改,并且只会 提供全面通知。使用 Intern

我正在使用FileSystemWatcher扫描从web应用程序上载文件的文件夹。我有1000多个文件被上传到这个文件夹。现在,问题是FileSystemWatcher是在复制第一个文件时启动的,有时,它并不适用于所有文件。任何建议都是非常值得欣赏的。

文件系统观察者说(我的重点):

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

请注意,当缓冲区大小增加时,FileSystemWatcher可能会错过事件 超过了。为避免遗漏事件,请遵循以下准则:

通过设置InternalBufferSize属性增加缓冲区大小

避免观看文件名较长的文件,因为文件名较长 有助于填充缓冲区。考虑重命名这些文件 使用较短的名称

使事件处理代码尽可能短


如果您尝试了上述方法,但仍然不够可靠,恐怕唯一的解决方案是订阅该活动,并在每次发生时手动枚举目录内容。

详细说明Jon的答案:

还有另一种可能的解决方案来推迟缓冲区溢出的发生。通过处理您监视的事件(例如创建的事件),您可以尽可能快地从缓冲区中删除与事件相关的信息,以便它可以回收此空间

为了加快速度,您可以选择异步处理文件。一旦触发该事件,您就可以将文件的完整路径排入队列,然后由工作线程处理该队列。绑定到已创建事件的事件处理程序的职责减少为向队列添加字符串(文件路径)

例如:

public class FileProcessor
{
    private readonly Queue<string> files = new Queue<string>();

    public void EnqueueFile(string path)
    {
        files.Enqueue(path);
    }
}
你可以在我两年前写的一篇文章中找到更多关于这方面的信息(包括示例代码):

static void file_Created(object sender, FileSystemEventArgs e)
{
    _fileProcessor.EnqueueFile(e.FullPath);
}