Hallo zusammen,
ich habe für ein Softwareprojekt eine AutoImport-Schnittstelle realisiert, welche über den Filesystemwatcher ständig ein Verzeichnis überwacht. Wird eine Exportdatei eines Fremdsystems dort abgelegt, reicht der Watcher den Dateipfad an die API-Importroutine des empfangenden Systemes weiter.
Ich muss nun aber in einer zukünftigen Programmversion mehrere Verzeichnisse überwachen. Bisher bekommt der Watcher aus einer XML-Datei beim Dienststart das zu überwachende Verzeichnis und bestimmte Parameter mit.
Wie kann ich zukünftig mehrere Watcher laufen lassen und auch einzelne Instanzen für die Überwachung stoppen. Wie kann ich bestimmte Instanzen die zur Laufzeit erzeugt werden beeinflussen und auch neue Settings für eine bestimmte Instanz mitgeben?
Vielen Dank für eure Hilfe
Gruß Ben
Nutze eine Klasse, welche die einzelnen FileSystemWatcher verwaltet.
Speichere alle FileSystemWatcher Konfigurationen in die selbe XML-Datei und deserialisiere sie in der Klasse, welche deine Watcher verwaltet. - Pro Konfiguration erstellst du nun einen Watcher und übergibst die jeweilige Version.
Das wäre zumindest meine Vorgehensweise.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Hi inflames,
danke dir. Aber bei der von dir empfohlenen Vorgehensweise müsste ich doch schon genau wissen, wie viele Watcher ich haben möchte (zum Serialisieren), oder?
Ich möchte die Anzahl jedoch vollkommen dynamisch halten. Ausserdem wollte ich nicht das ganze Objekt serialisieren sondern möchte die Objekte zur Laufzeit erzeugen und nur die Settings aus einer XML-Datei holen.
Mein Problem ist letztendlich die Art und Weise, wie ich auf eine spezielle Objektinstanz zugreifen kann, die ich erst zur Laufzeit und nicht zur Entwurfszeit habe. Ich könnte die Objekte ja in einer List <T> speichern oder? Aber wie komme ich an genau eine spezielle Instanz ran?
Gruß
Ben
Hallo
Also im Falle von List<T> sicher über den Index.
Gruss
Balaban_s
inflames Lösung ist schon vollkommen ok :
Du hast eine gewisse Anzahl an FileSysWatchern in einer Collection die x beliebig Groß ist.
Denkbar wäre das ganze auch in einem Dictionary wo du als Key den jeweiligen Pfad hast und und und
Aber Achtung ! Ab einer gewissen Zahl , je nach System , kann es vorkommen das die Dinger nicht richtig reagieren. Je nach einkommenden Daten ist es nötig den Puffer für den FSW nach oben zu setzten.
Beachte auch noch, das Du die Methoden, welche dann durch den FileSystemWatcher ausgelöst werden sollen, in einen eigenen Thread auslagerst ( ThreadPool), sonst kann es schnell passieren, das ein Engpass enstehen kann, wenn die Methode lange laufzeiten hat.
Was auch gut in diesem zusammenhang passt SyncQueue<T> - Eine praktische Jobqueue.
Ansonsten wurde schon alles gesagt, was du beachten solltest. Ganz besonders wichtig wird sein, das Du den Buffer höher stellst, wenn häufige und schnelle Änderungen zu erwarten sind.
Grüße Stephan
Super! Vielen Dank euch allen für eure Hilfe!
Und danke für die Info mit dem Buffer. Habe auch schon gelesen, dass die Watcher ab einer gewissen Anzahl manchmal einen Event nicht auslösen etc...
Wird eine Exportdatei eines Fremdsystems dort abgelegt, reicht der Watcher den Dateipfad an die API-Importroutine des empfangenden Systemes weiter
Warum nicht einfach einen Timer (System.Threading.Timer) verwenden, der jede Sekunde entsprechende Verzeichnisse nach neuen Dateien durchsucht und anschließend deine API aufruft? So eine Klasse wäre schnell geschrieben und zu dem ressourcenschonender und skalierbarer als mehrere FileSystemWatcher.
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...