Sorry, war wohl nicht ganz klar. Ein FileSystemWatcher überprüft im Hintergrund ein Verzeichnis. Angestoßen durch den FileSystemWatcher holt eine Methode Dateien aus dem Verzeichnis. Wenn dabei eine Exception passiert, will ich das natürlich an die Oberfläche melden. Das geht aber nicht, weil das ja in einem anderen Thread als dem Oberflächen Thread passiert. Wird es klarer?
Beim FileSystemWatcher kann es oft mal zu Exceptions kommen da manche Events mehrfach gefeuert werden. Obacht auch bei Virenscanner.
Zitat MSDN: Häufige Vorgänge in Dateisystemen können mehrere Ereignisse auslösen. Wenn eine Datei z. B. von einem Verzeichnis in ein anderes verschoben wird, werden möglicherweise mehrere OnChanged-Ereignisse und einige OnCreated-Ereignisse sowie OnDeleted-Ereignisse ausgelöst. Das Verschieben einer Datei ist ein komplexer Vorgang, der aus mehreren einfachen Vorgängen besteht und daher mehrere Ereignisse auslöst.
Kommt drauf an, wie Du Deinen Thread startest. Wenn Du den BackgroundWorker benutzt, bekommst Du die Ex im RunWorkerCompleted-Event.
Wenn Du den Thread auf eine Weise gestartet hast, die diesen Komfort nicht bietet (z.B. über ThreadPool.QueueUserWorkItem), dann mußt Du die Ex im Thread selbst fangen und Dich selbst darum kümmern, dass der untergeordnete Thread dem übergeordneten die nötigen Informationen übermittelt. Bei QueueUserWorkItem kann man das z.B. über den state-Parameter abbilden.
Kommt natürlich auch darauf an, was Du dann mit der Ex machen willst, also ob es fachliche Fehler sind, die tatsächlich irgendwie im Kontext des übergeordneten Threads behandelt werden können, oder "unvorhergesehene Katastrophen", bei denen Du eh kaum eine andere Wahl hast, als sie zu protokollieren und dann an einem geeigneten Punkt neu aufzusetzen (default: Anwendung beenden). Für letzteres kannst Du Dich für das AppDomain.UnhandledException-Ereignis registrieren.
UPDATE, nach deinem Kommentar: Sieht so aus, als käme der zweite Fall in Betracht. Dann könnte man das so lösen:
class MyFileWatcher { public EventHandler<EventArgs> ErrorOnReading;
public MyFileWatcher() { var fw = new FileSystemWatcher(); //configure... fw.Changed += new FileSystemEventHandler(fw_Changed); fw.EnableRaisingEvents = true; }
Zitat MSDN:
Häufige Vorgänge in Dateisystemen können mehrere Ereignisse auslösen. Wenn eine Datei z. B. von einem Verzeichnis in ein anderes verschoben wird, werden möglicherweise mehrere OnChanged-Ereignisse und einige OnCreated-Ereignisse sowie OnDeleted-Ereignisse ausgelöst. Das Verschieben einer Datei ist ein komplexer Vorgang, der aus mehreren einfachen Vorgängen besteht und daher mehrere Ereignisse auslöst.