Wie behandelt man Ausnahmen von einem BackgroundWorker-Thread?

8

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.

    
rem 20.02.2010, 16:05
quelle

4 Antworten

5

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%     
Doug Ferguson 20.02.2010, 16:37
quelle
6

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.

    
IordanTanev 20.02.2010 16:11
quelle
3
%Vor%     
Ken 20.02.2010 16:13
quelle
3

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%     
Sameh Deabes 20.02.2010 18:36
quelle