| |
VB.NET - Ein- und UmsteigerZwei 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... | |
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. | |
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 ? | |
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. | |
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. | |
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. | |
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. | |
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 | |
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. | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere Infos
|
|
|
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
|
|