Событие BackgroundWorker не запускается - PullRequest
1 голос
/ 14 января 2011

Работа с BackGroundWorker в моем приложении WPF 3.5 для запуска долго выполняющегося процесса в его собственном потоке, и когда я запускаю код в режиме отладки в VS2010, события DoWork и RunWorkerCompleted, похоже, не запускаются.

Мой код выглядит следующим образом:

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

У меня установлены точки останова на runworkerasync, и линия вызывается, ошибки не отлавливаются, а подпрограмма завершена. У меня также установлены точки останова на подпрограмме DoWork и RunWorkerCompleted, и после того, как подпрограмма Window_Loaded заканчивается, отладчик больше ничего не подсвечивает, поэтому я только предполагаю, что события не запускаются.

У меня два вопроса, в моем коде чего-то не хватает, что бы события не срабатывали, и является ли использование точек останова, установленных на подпрограммах Event, правильным способом отладки?

Любая помощь, которая может быть оказана, будет принята с благодарностью.

Мэтт

1 Ответ

4 голосов
/ 14 января 2011

DoWork и worker_Completed - события. Вы должны зарегистрировать их в обработчиках событий работника, чтобы он их запустил.

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

Редактировать: В VB синтаксис выглядит следующим образом:

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

Что касается вашего второго вопроса, то да, отладчик сломается, если вы установите точку останова в рабочей подпрограмме. DoWork работает в фоновом потоке ThreadPool, а RunWorkerCompleted вызывается и запускается в потоке пользовательского интерфейса (что делает backgroundWorkers настолько полезным.)

...