他のアプリケーションを起動するアプリケーションがあり、特定のデータファイルを作成するのを待っています(同時に1つのアプリケーションを監視しています)。アプリケーションが起動されるたびに、特定のディレクトリが作成される特定のファイルを監視します。私はこれを行うFileSystemWatcherを使用しています(それをディレクトリに設定してから、正しいファイル名をフィルタリングしてください)。これは最初(常に)素晴らしいですが、2番目のアプリケーションを起動してもイベントは発生しません。イベントを発生させる唯一の方法は、イベントハンドラにブレークポイントを設定するか、イベントハンドラにThread.Sleepコマンドがあるかどうかです。これは私にとっては非常に奇妙なようです...私が気づいていない競合状態はありますか?ここにコードがあります。私はThread.Sleep(500)を持っていることに注意してください。このコードでは、毎回コードが動作します。それがなければ失敗するでしょう。私は本当にスリープコマンドに頼らず快適です。どのような状態でもうまくいかない原因になるかどうかはわかりません。FileSystemWatcher - イベントが2回目に起動しない
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;
}
}
コードをもう一度動作させるには、なぜスリープ(またはブレークポイント)する必要があるのですか?
このコードは私にとっては大丈夫です。 – Simone
注:スイッチで 'e.ChangeType.ToString()'を使う必要はありません。 'e.ChangeType'をオンにして、' ChangeType.XXX'を作るだけです。これにより、厳密に型付けされ、エラーが発生しにくくなります。 – Femaref
ファイルシステムウォッチャーには多くの警告があるようです。 http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.oncreated.aspx つまり、さまざまなウォッチャーが同じディレクトリを監視していないことは確かですか? – NotMe