【发布时间】:2013-06-17 13:56:08
【问题描述】:
我有一个启动其他应用程序的应用程序,然后等待它们创建特定的数据文件(它一次监视一个应用程序)。每次启动应用程序时,它都会监视特定目录以查找要创建的特定文件。我正在使用 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;
}
}
有人知道为什么我需要使用睡眠(或断点)来让代码再次运行吗?
【问题讨论】:
-
注意:你不需要在开关中使用
e.ChangeType.ToString(),只需打开e.ChangeType并制作案例ChangeType.XXX。这使其具有强类型且不易出错。 -
文件系统观察者似乎有很多警告。 msdn.microsoft.com/en-us/library/…也就是说,你确定各个观察者看的不是同一个目录吗?
-
顺便说一句,您可能需要发布操作系统和其他涉及的详细信息,例如这些是否是本地路径等。
-
感谢关于 ChangeType 的说明。我确定目录是正确的。按预期运行和仅第一次运行之间的唯一区别是 Thread.Sleep。 p.s.我在 Windows 7 上使用本地路径。
-
您确定 watcher.Created 注册在不存在断点的情况下多次发生在不同的目录上吗?添加日志行通常可以帮助调试这些类型的问题......因为设置断点会提供不同的结果......
标签: c# filesystemwatcher