Fast überall bekommt man FilesystemWatcher-Code zu Gesicht, der sich mit dem Problem rumärgert, dass die FSW-Events im Nebenthread feuern.
Das muss nicht sein, denn wenn man der
Da alle Controls im selben Thread erstellt werden (geht kaum anders), treten nun keinerlei Threading-Probleme mehr auf.
Aber es geht sogar noch einfacher: Man ziehe einfach einen FSW aus der Toolbox aufs Form.
So ist der FSW bereits von vornherein im Gui integriert und synchronisiert.
Im Download hab ich als Bonus auch noch ein
Hier noch der Code:
Also
Zu beachten ist auch, dass die
Das muss nicht sein, denn wenn man der
FSW.SynchronizingObject
-Property ein gültiges Control zuweist, dann "synchronisiert" er sich damit, d.h.: feuert seine Events in genau dem Thread, von dem dieses Controls erstellt wurde.Da alle Controls im selben Thread erstellt werden (geht kaum anders), treten nun keinerlei Threading-Probleme mehr auf.
Aber es geht sogar noch einfacher: Man ziehe einfach einen FSW aus der Toolbox aufs Form.
So ist der FSW bereits von vornherein im Gui integriert und synchronisiert.
Im Download hab ich als Bonus auch noch ein
PropertyGrid
aufs Form gezogen, und dessen SelectedObject
auf den FilesystemWatcher eingestellt - nun kann man sogar zur Laufzeit Änderungen am FSW vornehmen und deren Auswirkungen beobachten.Hier noch der Code:
VB.NET-Quellcode
- Imports System.IO
- Public Class frmFileSystemWatcherTest
- Public Sub New()
- InitializeComponent()
- 'FileSystemWatcher1.SynchronizingObject = Me 'Braucht nicht extra zugewiesen werden, da der Watcher Designer-generiert ist
- 'FileSystemWatcher1.SynchronizingObject = Nothing 'testweise das Threading-Problem wieder heraufbeschwören
- FileSystemWatcher1.Path = Path.GetFullPath("..\..\..")
- End Sub
- Private Sub FileSystemWatcher1_Changed(sender As Object, e As IO.FileSystemEventArgs) Handles FileSystemWatcher1.Changed, FileSystemWatcher1.Created, FileSystemWatcher1.Deleted, FileSystemWatcher1.Renamed
- FileSystemEventArgsBindingSource.Add(e)
- End Sub
- End Class
.Changed
, .Created
, .Deleted
, .Renamed
- alles wird gleichermassen behandelt, indem einfach das EventArgs der BindingSource zugefügt wird - wodurch es im DataGridView zur Anzeige kommt.Zu beachten ist auch, dass die
e.Name
-Property nicht zwangsläufig einen Dateinamen bezeichnet - es kann auch ein Ordner sein, oder sogar ein relativer Pfad (relativ zum überwachten Pfad), wenn das Ereignis ein Objekt in einem Unterordner betrifft.Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()