Ho un'applicazione che avvia altre applicazioni, quindi attende che creino un file di dati specifico (guarda un'applicazione alla volta). Ogni volta che un'applicazione viene avviata, controlla una directory specifica per creare un file specifico. Sto usando FileSystemWatcher per farlo (impostarlo sulla directory, quindi filtrare il nome file corretto). Funziona alla grande la prima volta (sempre), ma la seconda applicazione lanciata non accende mai l'evento. L'unico modo in cui sembra attivare l'evento è se inserisco un punto di interruzione nel gestore eventi o se ho un comando Thread.Sleep nel gestore eventi. Mi sembra molto strano ... ci sono delle condizioni di gara di cui non sono a conoscenza? Ecco il codice. Si noti che ho un Thread.Sleep (500). Con questa linea il codice funziona sempre. Senza di esso fallirà. Non mi sento davvero a mio agio affidandomi a un comando del sonno. Non sono sicuro di quale condizione causerà che non funzioni altrettanto bene.FileSystemWatcher - evento che non si attiva la seconda volta
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;
}
}
Qualcuno sa il motivo per cui ho bisogno di avere quel sonno (o break-point) per ottenere il codice di lavorare una seconda volta?
questo codice mi sembra a posto. – Simone
nota: non è necessario utilizzare 'e.ChangeType.ToString()' nello switch, basta accendere 'e.ChangeType' e creare i casi' ChangeType.XXX'. Ciò lo rende fortemente digitato e meno soggetto a errori. – Femaref
L'osservatore del filesystem sembra avere molti avvertimenti. http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.oncreated.aspx Detto questo, sei sicuro che i vari osservatori non stiano guardando la stessa directory? – NotMe