FileSystemWatcher - 第二次不触发事件

cwo*_*cwo 7 c# filesystemwatcher

我有启动其他应用程序的应用程序,然后等待他们创造一个特定的数据文件(其手表一次在一个应用程序).每次启动应用程序时,它都会监视要创建的特定文件的特定目录.我正在使用FileSystemWatcher执行此操作(将其设置为目录,然后筛选正确的文件名).这是第一次(总是)很好用,但是第二次启动的应用程序永远不会激活事件.它似乎触发事件的唯一方法是,如果我在事件处理程序中放置一个断点,或者如果我在事件处理程序中有一个Thread.Sleep命令.这对我来说似乎很奇怪......是否有一些我不知道的竞争条件?这是代码.注意我有一个Thread.Sleep(500).有了这一行,代码每次都有效.没有它会失败.我真的不习惯依赖睡眠命令.我不确定什么条件会导致不能正常工作.

    public static void watchFiles(string path)
    {
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = path;
        watcher.Created += new FileSystemEventHandler(watcher_Handler);
        watcher.EnableRaisingEvents = true;
   }

    public static void watcher_Handler(object sender, FileSystemEventArgs e)
    {
        //Hack - the sleep allows the second and third application to be caught by this event
        Thread.Sleep(500);

        switch (e.ChangeType.ToString())
        {
            case "Changed":
                break;
            case "Deleted":
                break;
            case "Created":
                if (e.Name == "log.dat")
                {
                    parseDataFile();
                    moveHTMLtoLMS();

                }
                break;
            default:
                break;
        }
    }
Run Code Online (Sandbox Code Playgroud)

任何人都知道我为什么需要睡眠(或断点)才能让代码第二次运行?

Jef*_*ado 1

根据该类的文档System.IO.FileSystemWatcher

Windows 操作系统通知您的组件由 FileSystemWatcher 创建的缓冲区中的文件更改。如果短时间内发生多次变化,缓冲区可能会溢出。这会导致组件失去对目录中更改的跟踪,并且它只会提供全面通知。使用 InternalBufferSize 属性增加缓冲区大小的成本很高,因为它来自无法换出到磁盘的非分页内存,因此请保持缓冲区足够小但足够大,以免错过任何文件更改事件。为了避免缓冲区溢出,请使用 NotifyFilter 和 IncludeSubdirectories 属性,以便您可以过滤掉不需要的更改通知。

可能是事件的消耗速度不够快,并且内部缓冲区不够大,无法处理所有通知。默认情况下,观察程序处理FileNameDirectoryNameLastWrite通知,但您仅使用创建事件(文件和目录)。您的应用程序是否快速连续运行?我会尝试在应用程序的调用之间设置延迟(而不是事件处理程序),使用更具体的过滤器(仅通知FileName或仅监视使用该Filter属性的日志文件),增加内部缓冲区大小或以下任意组合多于。我认为这应该可以解决你的问题。