Aquí está mi enfoque:
// Consider having a List<String> named _changedFiles
private void OnChanged(object source, FileSystemEventArgs e)
{
lock (_changedFiles)
{
if (_changedFiles.Contains(e.FullPath))
{
return;
}
_changedFiles.Add(e.FullPath);
}
// do your stuff
System.Timers.Timer timer = new Timer(1000) { AutoReset = false };
timer.Elapsed += (timerElapsedSender, timerElapsedArgs) =>
{
lock (_changedFiles)
{
_changedFiles.Remove(e.FullPath);
}
};
timer.Start();
}
Esta es la solución que usé para resolver este problema en un proyecto donde estaba enviando el archivo como archivo adjunto en un correo. Evitará fácilmente el evento que se disparó dos veces, incluso con un intervalo de temporizador más pequeño, pero en mi caso 1000 estuvo bien, ya que estaba más feliz con la falta de pocos cambios que con inundar el buzón con> 1 mensaje por segundo. Al menos funciona bien en caso de que se cambien varios archivos al mismo tiempo.
Otra solución que he pensado sería reemplazar la lista con un archivo de mapeo de diccionario a su MD5 respectivo, para que no tenga que elegir un intervalo arbitrario ya que no tendría que eliminar la entrada pero actualizar su valor, y cancela tus cosas si no ha cambiado. Tiene la desventaja de tener un Diccionario creciendo en la memoria a medida que se monitorean los archivos y consumiendo más y más memoria, pero he leído en alguna parte que la cantidad de archivos monitoreados depende del búfer interno del FSW, por lo que tal vez no sea tan crítico. No sé cómo el tiempo de computación MD5 afectaría el rendimiento de su código tampoco, cuidado = \