FileSystemWatcher Queue

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von revmaster.

    FileSystemWatcher Queue

    Hallo Zusammen,

    ich bin in VB.Net sicher kein Neuling, aber aktuell macht mir ein Problem echt Kopfschmerzen.

    Kurz zu meiner "Problemstellung":

    Ich überwache ein Verzeichnis auf das Neuerstellen von "*.pdf* Dateien.
    Wenn eine neue "PDF Datei" auftaucht, wird per "FileSystemWatcher" eine "Sub" aufgerufen welche dann diverse Sachen erledigt (Auslesen des PDF Dateinamens, Prüfen ob vorhandene Dateien mit einer anderen Endung in einem anderen Verzeichnis da sind, Wenn ja, Konvertieren der Dateien mittels "Autodesk Inventor API/SDK´s", Schreiben in eine SQL Datenbank usw usw.)

    Diese "sub" kann natürlich einige Zeit in Anspruch nehmen.

    Sollte während der Ausführung der "sub" eine weitere "PDF" Datei "auftauchen" wird diese ja in der "Queue" des "FileSystemWatchers" eingetragen und erst wieder übergeben, wenn die "sub" "durch" ist.

    So weit so gut. Nun kann es aber passieren, dass nicht nur eine "PDF" Datei "auftaucht", sondern mehrere während die "sub" noch läuft.

    Dann passiert leider folgendes :
    Wenn die "sub" abgearbeitet ist, werden dann aber schlagartig alle "neuen PDF´s" übergeben. Das Programm bekommt natürlich nur die "erste neue PDF Datei" mit und startet wieder die "sub".
    Die anderen neuen "PDF´s" gehen "verloren".

    Mach ich da irgendwas falsch, bzw. habe ich einen Denkfehler ... ?

    Ein möglicher Workaround wäre natürlich die "Events" des "FileSystemWatcher" Events in eine Textbox zu schreiben und diese dann nach und nach abzuarbeiten.

    Frage mich aber nun .. warum hat das "FileSystemWatcher" Event eine Queue wenn er die dann sofort komplett übergibt.

    Vielleicht kann mir da jemand etwas unter die Arme greifen ... Vielen Dank

    Gruß

    Alex.
    Ein klassisches Producer Consumer Problem.
    Schematisch sieht das so aus: In der FileSystemWatcher_Created-Sub fügst Du die Datei einer Queue hinzu. In einem ganz anderen Thread wird immer ein Item aus der Liste genommen und verarbeitet. Dadurch, dass das Verarbeiten in einem anderen Thread passiert, wird der FileSystemWatcher nicht blockiert. Der kann schön weiter Dateien in die Queue packen. Es ist dann auch möglich (wenn es Dein System zulässt), mehrere Threads gleichzeitig die PDFs verarbeiten zu lassen.
    Die Schwierigkeit liegt hier bei der Synchronisation. Man kann natürlich nicht einfach eine normale Queue verwenden, denn wenn ein Thread gerade ein Item aus der Liste nimmt, während der andere eines einfügt, oder wenn mehrere Threads gleichzeitig Items rausnehmen, dann weiß der Geier was am Ende rauskommt.
    Wenn Du im Forum nach "Producer Consumer" suchst, oder nach ".NET Producer Consumer Queue" suchst, dann solltest Du Ansätze finden können.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Hallo Niko,

    vielen Dank für den Tip. Habe da einiges gefunden. Das wird ja lustig :)

    Das mit meheren Thread´s muß ich mal prüfen ob das so einfach geht (Zugriff auf Autodesk Inventor (den ich brauche zum Konvertieren) ...)

    Aber nun weiß ich wenigstens welche Spur ich verfolgen muß.

    --- Thread kann closed ---