FileSystemWatcher-第二次不触发事件)。每次应用程序启动时,它都会监视特定目录以查找要创建的特定文件。我正在使用FileSystemWatcher来执行此操作(将其设置为一个目录,然后过滤出正确的文件名)。这第一次(总是)工作正常,但第二次启动应用程序时,该事件永远不会被触发。它似乎触发事件的唯一方法是,如果我在事件处理程序中放置一个断点,或者如果我在事件处理程序中有一个Thread.Sleep命令。这对我来说似乎很奇怪......是否有一些我不知道的竞争条件?这是代码。注意我有一个Thread.Sleep(500)。使用这一行,代码每次都有效。没有它就会失败。我真的不习惯依赖睡眠命令。我不确定什么条件会导致它不起作用。publicstaticvoidwatchFiles(stringpath){FileSystemWatcherwatcher=newFileSystemWatcher();watcher.Path=路径;watcher.Created+=newFileSystemEventHandler(watcher_Handler);watcher.EnableRaisingEvents=true;}publicstaticvoidwatcher_Handler(objectsender,FilesSystemEventArgee){//Hack-睡眠允许第二个和第三个应用程序被这个事件捕获Thread.Sleep(500);switch(e.ChangeType.ToString()){case"Changed":break;案例“已删除”:中断;case"Created":if(e.Name=="log.dat"){parseDataFile();moveHTMLtoLMS();}休息;默认值:中断;任何人都知道为什么我需要睡眠(或断点)以使代码第二次工作?根据System.IO.FileSystemWatcher类的文档:Windows操作系统通知组件由FileSystemWatcher创建的缓冲区中的文件更改。如果短时间内有很多变化,缓冲区可能会溢出。这会导致组件不跟踪目录中的更改,只会提供一揽子通知。使用InternalBufferSize属性增加缓冲区的大小非常昂贵,因为它来自无法换出到磁盘的非分页内存,因此请保持缓冲区尽可能小,但要足够大,以免错过任何文件更改事件。为避免缓冲区溢出,请使用NotifyFilter和IncludeSubdirectories属性以过滤掉不需要的更改通知。可能是事件消耗速度不够快,内部缓冲区不够大,无法处理所有通知。默认情况下,观察者处理FileName、DirectoryName、LastWrite通知,但您只使用创建事件(文件和目录)。您的应用程序是否快速连续运行?我试过在应用程序调用(而不是事件处理程序)之间设置延迟,使用更具体的过滤器(只用FileName通知或只用Filter属性监视日志文件),增加内部缓冲区大小,或上面提到的任何组合.我认为这应该可以解决您的问题。publicstaticvoidwatchFiles(stringpath){FileSystemWatcherwatcher=newFileSystemWatcher();watcher.Path=路径;watcher.Created+=newFileSystemEventHandler(watcher_Handler);watcher.EnableRaisingEvents=true;watcher变量在这个方法结束时有资格进行垃圾回收。与其将其设为局部变量,不如将其设为类级别成员:privatestaticFileSystemWatcherwatcher;publicstaticvoidwatchFiles(stringpath){if(watcher!=null){watcher.EnableRaisingEvents=false;watcher.Created-=newFileSystemEventHandler(watcher_Handler);}watcher=newFileSystemWatcher();watcher.Path=路径;watcher.Created+=newFileSystemEventHandler(watcher_Handler);watcher.EnableRaisingEvents=true;您只能参加一个“已创建”的活动。您还需要收听其他所有内容-OnChanged、OnDeleted-http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx编辑:大多数程序在已经存在时不会“创建一个文件。你可以使用FileMon(现在是ProcessMonitor-http://technet.microsoft.com/en-us/sysinternals/bb896645)来查看每个程序对你的文件做了什么。我在这里遇到了完全相同的问题(运行WindowsXP)。你的hack解决了这个问题。我想添加一些可能相关的注释。在我的例子中,文件名总是相同的:C:\blah.txt被创建、删除、创建等。另外,我'm使用技巧隐藏我的应用程序:Integrator.StartMonitor();//启动文件监视器!Formf=newForm();f.ShowInTaskbar=false;f.ShowIcon=false;f.StartPosition=FormStartPosition.Manual;f.Location=newPoint(-32000,-32000);f.Show();f.Hide();Application.Run();我的文件观察器在调试模式下工作,或者当我添加你的睡眠hack时。它肯定是FileSystemWatcher的bug,以上是C#学习教程:FileSystemWatcher-第二次不触发事件分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
