2011-01-14 22 views
1

Arbeiten mit BackGroundWorker in meiner WPF 3.5-Anwendung einen langen laufenden Prozess auf einem eigenen Thread ausführen und wenn ich den Code im Debug-Modus in VS2010 ausführen, scheinen die DoWork und RunWorkerCompleted Ereignisse nicht ausgelöst werden .BackgroundWorker Ereignis nicht feuern

Mein Code ist wie folgt:

Implements INotifyPropertyChanged 

Private WithEvents worker As System.ComponentModel.BackgroundWorker 

Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 

Private Sub NotifyPropertyChanged(ByVal info As String) 
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info)) 
End Sub 

Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) 
    Dim worker = New System.ComponentModel.BackgroundWorker 
    worker.WorkerReportsProgress = True 
    worker.WorkerSupportsCancellation = True 
    Dim str() = New String() {"IDA00005.dat", "Adelaide"} 
    Try 
    worker.RunWorkerAsync(str) 
    Catch ex As Exception 
    MsgBox(ex.Message) 
    End Try 
End Sub 

Private Sub worker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles worker.DoWork 
    Dim form_Helpder As New test_global 
    Dim ds As DataSet = form_Helpder.getWeatherData(e.Argument(0), e.Argument(1)) 
    e.Result = ds 
End Sub 

Private Sub worker_Completed(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) Handles worker.RunWorkerCompleted 
    If e.Error IsNot Nothing Then 
    MsgBox(e.Error.Message) 
    Else 
    ... 
    NotifyPropertyChanged("lbl_minToday") 
    ... 
    End If 
End Sub 

Ich habe Setup-Haltepunkte an RunWorkerAsync und die Linie genannt wird, sind Fehler nicht abgefangen, sondern die Unter beendet. Ich habe Breakpoints auch auf dem DoWork und RunWorkerCompleted Sub und nach dem Window_Loaded Sub-Enden eingerichtet, nichts anderes wird vom Debugger markiert, so dass ich nur davon ausgehe, dass die Events nicht ausgelöst werden.

Ich habe zwei Fragen, gibt es etwas fehlt in meinem Code, die die Ereignisse nicht auslösen würde, und ist die Verwendung von Breakpoints auf Event Subs die richtige Art des Debuggens?

Jede Hilfe, die zur Verfügung gestellt werden kann, wird sehr geschätzt.

Matt

Antwort

4

DoWork und worker_Completed sind Ereignisse. Sie müssen sie für die Ereignisbehandlungsroutinen des Arbeiters registrieren, damit der Arbeiter sie auslöst.

worker.DoWork += worker_DoWork 
worker.RunWorkerCompleted += worker_Completed 

Edit: In VB, es sieht aus wie die Syntax ist:

AddHandler worker.DoWork, AddressOf worker_DoWork 
AddHandler worker.RunWorkerCompleted, AddressOf worker_Completed 

Was Ihre zweite Frage, ja, wird der Debugger brechen, wenn Sie einen Haltepunkt auf dem Arbeiter Unterprogramm gesetzt. DoWork läuft auf einem Hintergrund ThreadPool-Thread, während RunWorkerCompleted ausgelöst wird und auf dem UI-Thread läuft (was ist, was backgroundWorkers so nützlich macht.)

+0

Großartig, ich hatte die C# -Version zuvor gesehen, aber ich konnte es nicht zur Arbeit so nur gemustert bekommen dass es eine C# Sache war. Das Hinzufügen dieser zwei Zeilen funktionierte, vielen Dank für Ihre Unterstützung. – Lima

Verwandte Themen