L'une des choses qui m'a longtemps dérangé à propos de FileSystemWatcher est la façon dont il déclenche plusieurs événements pour une seule modification logique d'un fichier. Je sais pourquoi cela arrive, mais je ne veux pas avoir à m'en soucier - je veux juste refaire le fichier une fois, pas 4-6 fois de suite. Idéalement, il y aurait un événement qui ne se déclencherait que lorsqu'un fichier donné est modifié, plutôt qu'à chaque étape du processus.Extensions réactives par rapport à FileSystemWatcher
Au fil des ans, j'ai trouvé diverses solutions à ce problème, de divers degrés de laideur. Je pensais que Reactive Extensions serait la solution ultime, mais il y a quelque chose que je ne fais pas bien, et j'espère que quelqu'un peut signaler mon erreur.
J'ai une méthode d'extension:
public static IObservable<IEvent<FileSystemEventArgs>> GetChanged(this FileSystemWatcher that)
{
return Observable.FromEvent<FileSystemEventArgs>(that, "Changed");
}
En fin de compte, je voudrais obtenir un événement par nom de fichier, dans une période donnée - de sorte que quatre événements dans une ligne avec un nom de fichier unique sont réduits à un événement, mais je ne perds rien si plusieurs fichiers sont modifiés en même temps. BufferWithTime
sonne comme la solution idéale.
var bufferedChange = watcher.GetChanged()
.Select(e => e.EventArgs.FullPath)
.BufferWithTime(TimeSpan.FromSeconds(1))
.Where(e => e.Count > 0)
.Select(e => e.Distinct());
Quand je souscris à cette observable, un seul changement dans un fichier surveillé déclenche ma méthode d'abonnement quatre fois de suite, ce qui va à l'encontre plutôt le but. Si je supprime l'appel Distinct()
, je vois que chacun des quatre appels contient deux événements identiques - il y a donc une mise en mémoire tampon. Augmenter le TimeSpan passé à BufferWithTime
semble n'avoir aucun effet - je suis allé aussi haut que 20 secondes sans aucun changement de comportement.
Ceci est ma première incursion dans Rx, donc il me manque probablement quelque chose d'évident. Est-ce que je le fais mal? Est-ce qu'il y a une meilleure approche? Merci pour vos suggestions ...
Pourriez-vous conclure dans un programme complet? Je serais intéressé à enquêter ... –
Oui, je vais faire un cas de test isolé. Maintenant que j'y pense, j'ai plus d'un observateur manipulant plus d'un dossier, et je dois prouver que ce n'est pas quatre observateurs différents qui reçoivent la même paire d'événements d'une façon ou d'une autre. –