vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Zwei Threads als Dienst 
Autor: LordLuchs
Datum: 23.12.21 12:29

Guten Tag,
bin neu hier und seit kurzem beschäftige ich mich mit VB.Net.
Hab schon viel gesucht aber nicht das passende für mein Problem gefunden, oder ich suche nicht das richtige...
Also... Vielleicht könnt Ihr mir nen Denkanstoß geben.
Ich habe einen Dienst programmiert, dieser soll mehrere Verzeichnisse mit einem Filewatcher überwachen,
neu hinzugefügte Dateien dann in einem Array ablegen.
Das funktioniert auch prima, die Dateien liegen mit dem kompletten Pfad im Array...
Jetzt möchte ich das zu einer bestimmten Zeit ein Copy-Job startet der die Dateien aus dem Array dann in
ein definiertes Verzeichnis kopiert. Der Filewatcher soll aber im Hintergrund weiterlaufen.
Das kopieren funktioniert eigenständig (manuell angestoßen) ebenfalls prima..
wie bekomme ich nun beide Threads zusammen ??
Wäre der backgroundworker das richtige dazu ??
(eine ähnliche Anwendung hatte ich mal in Java entwickelt, da klappte das mit den Threads gut.
FileSystemWatcher überwachte Verzeichnisse und kopierte diese in ein Ziel, nach einer bestimmten Uhrzeit
startete, über ein TimerEvent, ein Druckjob)

Danke schon mal...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zwei Threads als Dienst 
Autor: Manfred X
Datum: 23.12.21 14:53

Hallo!

(Der Watcher läuft grundsätzlich in einem eigenen Thread.)
Lege beide Aufgaben (Liste führen, Dateien Kopieren) in jeweils einen eigenen Thread.

Die Namen der neu hinzugefügten Dateien würde ich in eine List(of ...)
eintragen (dynamische Listenlänge).

Vor dem Kopieren würde ich die aktuelle Liste für Zugriffe sperren (Lock),
die aktuell vorhandenen Items (Dateipfade) kopieren, die Liste entsperren
und danach den Kopiervorgang ausführen.

Den Backgroundworker würde ich für einen Dienst weniger empfehlen.
Diese Klasse ist eher für die Kommunikation eines Hintergrundprozesses mit
dem Oberflächenprozess konzipiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zwei Threads als Dienst 
Autor: LordLuchs
Datum: 23.12.21 15:19

Hallo, Danke...

eine List hab ich schon... Sorry... Array hab ich für den Filewatcher..
was meinst du mit Dateien aus der Liste kopieren, liste entsperren und dann Kopiervorgang starten ?
Wo kopiere ich die dateien aus der Liste denn hin ? Ist das noch nicht der Kopiervorgang ???

.
.
.
Dim aFileWatcherInstance As ArrayList = New ArrayList
Dim aFileCollector As New List(Of String)
 
 
    'hier wird der Filewatcher aufgerufen.. für alle Verzeichnisse die ein 
    ' definiertes Präfix haben
    Public Sub fnc_StartWatching(ByVal copyEvent As Boolean)
        Dim sSrcPath As String = S_Config.sQuelle
        If copyEvent = True Then
            EventLog.WriteEntry("AnalysenSource", "Verzeichnis überwachung" & _
              "aktiv auf " & sSrcPath)
            prcLog("Verzeichnis überwachung aktiv auf " & sSrcPath)
            Dim dir = New DirectoryInfo(sSrcPath)
            For Each d As DirectoryInfo In dir.GetDirectories(S_Config.sPrefix _
              + "*")
                prcLog(".. überwachung aktiv auf " & S_Config.sQuelle + "\" + _
                d.ToString)
                Dim oFileWatcher As FileSystemWatcher = New FileSystemWatcher _
                With {
                        .Path = S_Config.sQuelle + "\" + d.ToString,
                        .Filter = "*.*"
                    }
                If blnMonitorCreated Then
                    AddHandler oFileWatcher.Created, AddressOf _
                      FileSystemWatcherCreated
                End If
                oFileWatcher.EnableRaisingEvents = True
                'Filewatcher Instanz in ein Array schreiben
                aFileWatcherInstance.Add(oFileWatcher)
            Next
            copyEvent = False
        Else
            For Each fsw In aFileWatcherInstance
                fsw.EnableRaisingEvents = False
            Next
            For i = 1 To aFileWatcherInstance.Count
                aFileWatcherInstance.Remove(1)
            Next
            EventLog.WriteEntry("AnalysenSource", "Verzeichnis überwachung" & _
              "beendet")
            copyEvent = False
        End If
    End Sub
 
    'Bei neu erstellten Dateien, Datei incl Pfad in Liste schreiben
    Private Sub FileSystemWatcherCreated(ByVal sender As Object, ByVal e As _
      FileSystemEventArgs)
        sFullFileName = e.FullPath
        prcLog("Datei '" & sFullFileName & "' wurde neu erstellt.")
        'Neue Dateien kopieren (alt!)
        'fnc_CopyFile(sFullFileName)
        'Neue Dateien in Liste einfügen
        aFileCollector.Add(sFullFileName)
    End Sub
 
    'hier werden die Dateien aus der Quelle in ein Sammelverzeichnis kopiert
    Private Sub fnc_CopyFile(ByVal sFile As String)
        Dim sfileName As String = Path.GetFileNameWithoutExtension(sFile)
        Dim ext As String = Path.GetExtension(sFile)
 
        'Prüfen ob Dateiname im Ziel schon existiert, sonst umbennenen
        If File.Exists(S_Config.sZiel & "\" & sfileName & ext) Then
            Dim num As Integer
            Do
                num += 1
            Loop While File.Exists(S_Config.sZiel & "\" & sfileName & "(" & _
              num.ToString & ")" & ext)
            sfileName &= "(" & num.ToString & ")"
            prcLog("Datei '" & S_Config.sZiel & "\" & sFile & "' Umbenannt in " _
              & sfileName)
        End If
        'Dateien kopieren
        File.Copy(sFile, S_Config.sZiel & "\" & sfileName & ext, False)
        prcLog("Datei '" & sFile & "' nach " & S_Config.sZiel & "\" & sfileName _
          & " kopiert")
        If S_Config.sDeleteSource Then
            File.Delete(sFile)
            prcLog("Datei '" & sFile & "' gelöscht.")
        End If
    End Sub
das funktioniert wunderbar... nur möchte ich den kopiervorgang zu bestimmten zeiten starten
hilft das ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zwei Threads als Dienst 
Autor: Manfred X
Datum: 23.12.21 19:02

Wofür brauchst Du diese ganzen Watcher?

Es wäre doch vermutlich einfacher, beim Programmstart die Liste der vorhandenen
Datei-Namen zu lesen und in regelmäßigen Abständen im Filesystem zu prüfen, welche der
Datei-Namen noch nicht in dieser Liste stehen. Diese Namen werden in der Liste ergänzt
und die entsprechenden Dateien werden ins Backup-Verzeichnis kopiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zwei Threads als Dienst 
Autor: LordLuchs
Datum: 23.12.21 19:48

Die Dateien kommen täglich zu unterschiedlichen zeiten.
Das ganze soll eigenständig als dienst laufen..
Im Manuellen Prozess habe ich alle Dateien aus den Unterschiedlichen Ordnern in einen "Sammelordner"
kopiert, dort eine Index datei erstellt (Damit man nachverfolgen kann welche Dateien angekommen sind)
Diese Index Datei wird gegen eine CSV Datei abgeglichen und die in der Index Datei vorhandenen werden
dann auf die entsprechenden Zielordner verteilt. (Sind auch wieder mehrere)
Beispiel.
Ordner
ABO_Taeglich
ABO_Monatlich
ABO_Prozesse
ABO_Projekte

Die Ordner werden durch einen externen Dienstleister befüllt, zeitlich aber nicht festgelegt.
Diese Dateien in diesen Ordern müssen dann auf Ordner in unserer Struktur verteilt werden, manche auch in mehreren Ordnern.
Jetzt Sammel ich alle Dateien aus ABO* in einen separatem Ordner und vergleiche diese mit der CSV Datei.
und kopiere diese dann entsprechend um.
Da eine Anwendung am Server im ungünstig ist möchte ich das halt als Dienst laufen lassen.
Klar kann ich das alles über einen Timertask machen und mehrmals täglich alle Ordner kopieren,
ich dachte nur das es mit dem Filewatcher eleganter wäre.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zwei Threads als Dienst 
Autor: Manfred X
Datum: 24.12.21 12:57

Man kann diese Aufgabe selbstverständlich mit Watchern realisieren.

Allerdings musst Du entstehende die Liste beim Multithreading
korrekt bearbeiten - also Items (=Namen neuer Dateien) kopieren,
diese Liste löschen und dann die entsprechenden Dateien kopieren.

Beispiele:
https://stackoverflow.com/questions/2257571/c-sharp-multithreaded-list-operations


Ab Framework 4 gibt es threadsichere Listen (System.Collections.Concurrent)

Beitrag wurde zuletzt am 24.12.21 um 13:22:01 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zwei Threads als Dienst 
Autor: sv00010
Datum: 25.12.21 09:14

Eventuell könntest du das Kopieren in einen Timer packen.
Pro Timer-Aufruf immer eine Datei kopieren.
Das würde ermöglichen, dass das Füllen der Liste der zu kopierenden Dateien und das Kopieren der Dateien unabhängig von einander laufen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zwei Threads als Dienst 
Autor: effeff
Datum: 26.12.21 17:36

Dazu reicht eine einfache Zeile in einer Batchdatei aus...

robocopy "c:\DeinQuellverzeichnis" "d:\DeinZielverzeichnis" /S /E /XO

Die Batchdatei lässt Du dann einfach periodisch per Aufgabenplanung von Windows ausführen. Es werden jeweils nur neue oder geänderte Dateien kopiert.

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zwei Threads als Dienst 
Autor: LordLuchs
Datum: 26.12.21 18:02

RoboCopy geht hier nicht, da in dem Eingangsverzeichnis ebenfalls andere unterverzeichnisse sind die
nicht kopiert werden sollen/dürfen.
/XO geht nicht da ich zwingend alle Dateien benötige..
Eingangsverzeichnis muss leer sein, sonst überschreibt der Anbieter diese dateien..
z.b. am 13.12 kommt die Datei 1202_Auswertung.csv mit den daten vom 13.12
am 14.12 kommt die Datei erneut... und somit wäre die vom 13.12 verloren...
hört sich komisch an ist aber so, wir haben da gewisse auflagen zu erfüllen
die dateien werden später umbenannt und in ggf in mehrere Verzeichnisse kopiert.
alle dateien müssen zu revisionszecken erhalten bleiben.
Es wird eine liste benötigt in der die Dateien enthalten sind die täglich dort ankommen (zwecks nachvollziebarkeit).
Es muss alles dokumentiert werden was mit der Datei passiert.

Ich habe das Programm jetzt soweit fertig...
-FSW kopiert ankommende dateien in Sammelverzeichnis, werden nach prüfung gelöscht.
-alle dort enthaltenen Dateien werden indexiert.
-Vergleich mit der "Soll" Liste findet statt.
-Fehlende Dateien(ggfs durch den Anbieter mit neuem Namen versehen wie 1202_Auswertung.csv / 1202-Auswertung.csv / 1202 Auswertung.csv) werden dokumentiert.
-der Admin erhält eine Benachrichtung .
-Dateien werden in Abteilungen kopiert.
-tägliche Auswertung der Dateien findet statt.
-csv zur Auswertung wird erstellt und dem Abteilungsleiter zugestellt.

Ich danke euch für eure Tipps und Anregungen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel