我有一个 FileSystemWatcher 设置来检查新文件,将内容存储在数据库中并删除文件。大约 10 天前,它开始忽略一些文件。我们谈论的是总共 50,000 个文件中的 1,500 个文件。通过手动将文件移动到不同的目录,然后再次将它们移动到监视目录,文件会被注意到。

InternalBufferSize 设置为 32 kB 以处理大批量。它可以一次处理 300 多个文件而不会出现问题,而现实甚至还差得远。

该程序最后一次接触是在 40 多天前,进行了与 FileSystemWatcher 无关的更改。它已经投入生产一年多了。在服务器负载中看不到峰值。

什么会导致这样的问题突然出现? FileSystemWatcher 是否有可能只是 unreliable

编辑
我创建了一个测试,其中创建了 1,000 个文件。运行它后,可以在事件日志中找到 3,000 个条目。所以我相信缓冲区溢出是不可能的?

    private void button1_Click(object sender, EventArgs e)
    {
        fsw = new FileSystemWatcher();
        fsw.Path = @"C:\temp\fsw-test";
        fsw.IncludeSubdirectories = false;
        fsw.NotifyFilter = NotifyFilters.FileName;
        fsw.Created += new FileSystemEventHandler(fsw_Created_handler);
        fsw.EnableRaisingEvents = true;
        fsw.InternalBufferSize = 32768;
        fsw.Error += fsw_Error_handler;
    }

    private void fsw_Created_handler(object sender, FileSystemEventArgs e)
    {
        new Thread(new ParameterizedThreadStart(work)).Start(e);
    }

    private void fsw_Error_handler(object sender, ErrorEventArgs e)
    {
        EventLog.WriteEntry("few test", e.GetException().Message);
    }

    private void work(object e)
    {
        try
        {
            EventLog.WriteEntry("fsw test", "Queueing File Started");
            Thread.Sleep(10000);
            EventLog.WriteEntry("fsw test", ((FileSystemEventArgs)e).Name);
            EventLog.WriteEntry("fsw test", "Queueing File Done");
        }
        catch (Exception ex)
        {
            EventLog.WriteEntry("fsw test", "Error = " + ex.StackTrace + " *** " + ex.ToString());
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        for (int i = 1; i <= 1000; i++)
        {
            System.IO.File.Create(@"C:\temp\fsw-test\" + i);
        }
    }

编辑 2
以多种方式对程序进行压力测试,并一遍又一遍地检查代码,没有发现任何问题。所以现在这是一个无法重现的错误,我将做一些更改以使其更频繁地记录并监控情况。

最佳答案

文件事件不排队。如果您正在处理一个文件,并且创建了新文件,您将错过这些事件。

解决此问题的一种方法是,当发生新文件事件时,处理文件并在返回之前检查新文件。循环直到没有文件。

关于.net - FileSystemWatcher 有时不工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9263363/

10-16 06:18