In einer WPF-App habe ich eine geplante Datenbankzugriffsaufgabe, die regelmäßig von einem Timer ausgeführt wird, und diese Aufgabe wurde in einem BackgroundWorker-Thread ausgeführt.
Wenn der Verbindungsversuch fehlgeschlagen ist, erhalte ich eine Ausnahme um try_catch
construction und möchte einen Statusleisten-Text in einem UI-Thread aktualisieren.
Gibt es eine vordefinierte Ereigniskonstruktion in BackgroundWorker
, um dies zu implementieren, etwa DoWorkEventHandler
oder RunWorkerCompletedEventHandler
, die dafür verwendet werden können? Wenn nicht, wie geht es besser?
Bearbeitet (hinzugefügt):
Wenn ich die Ausnahme in RunWorkerCompletedEventHandler
mit dem Parameter e.Error
behandeln will, funktioniert sie nicht. Wenn ich die Ausnahme im BackgroundWorker
-Thread nicht behandelt lasse, bleibt die Anwendung hängen und der Debugger zeigt auf die Code-Kette, die innerhalb von BackgroundWorker
thread ausgeführt wird, und sagt: Ausnahme wurde vom Benutzercode nicht behandelt .
In diesem Fall stoppt der Thread nicht einfach und signalisiert RunWorkerCompletedEventHandler
, dass er mit einem Fehler gestoppt hat, aber die gesamte Anwendung funktioniert nicht mehr.
Eine WPF-Benutzerschnittstelle kann mithilfe von Dispatcher.BeginInvoke aus einem Hintergrundthread aktualisiert werden.
Wenn beispielsweise Ihr Hintergrundcode Teil eines Fensters war, könnten Sie einen TextBlock aktualisieren:
%Vor%Bearbeiten:
Wenn Ihr Hintergrundcode in einer anderen Klasse als Ihrem Fenster wäre, könnten Sie eine Schnittstelle erstellen, die Ihnen hilft:
%Vor%Implementieren Sie die Schnittstelle in Ihrem Fenster
%Vor%Machen Sie in Ihrer Klasse mit dem Hintergrund-Worker eine Eigenschaft, die einen Verweis auf die Schnittstelle enthält.
%Vor%Initialisieren Sie in Ihrer Window-Klasse die Hintergrundklasse.
%Vor%Schließlich kannst du in deinem Hintergrund-Thread sagen:
%Vor% Der RunWorkerCompletedEventArgs e
des RunWorkerCompletedEventHandler
enthält die Eigenschaft Error
vom Typ Exception. Wenn während der Arbeit des Hintergrund-Threads keine Ausnahme aufgetreten ist, hat der Prépery als Wert null. Sonst enthält es den Fehler, der aufgetreten ist.
Setzen Sie die Eigenschaft WorkerReportsProgress des Hintergrund-Workers auf true und fügen Sie dann einen Ereignishandler für das Ereignis ProgressChanged hinzu. Im folgenden Code habe ich einen Event-Handler für Form.Load hinzugefügt.
Versuche nun den folgenden Code:
%Vor%Tags und Links wpf .net c# multithreading backgroundworker