gpt4 book ai didi

.net - FileSystemWatcher 有时不工作

转载 作者:行者123 更新时间:2023-12-02 09:41:29 28 4
gpt4 key购买 nike

我设置了一个 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com