【问题标题】:BackgroundWorker event not firingBackgroundWorker 事件未触发
【发布时间】:2011-01-14 15:04:01
【问题描述】:

在我的 WPF 3.5 应用程序中使用 BackGroundWorker 以使长时间运行的进程在其自己的线程上运行,当我在 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 设置了断点并调用了该行,没有捕获到错误,但 sub 已结束。我还在 DoWork 和 RunWorkerCompleted 子上设置了断点,在 Window_Loaded 子结束后,调试器没有突出显示任何其他内容,所以我只是假设事件没有被触发。

我有两个问题,我的代码中是否缺少任何东西会使事件不触发,并且使用在 Event subs 上设置的断点是正确的调试方式吗?

我们将不胜感激。

马特

【问题讨论】:

    标签: wpf backgroundworker


    【解决方案1】:

    DoWorkworker_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 被引发并在 UI 线程上运行(这就是 backgroundWorkers 如此有用的原因。)

    【讨论】:

    • 太好了,我以前看过 C# 版本,但我无法让它工作,所以只是想它是 C# 的东西。添加这两行有效,非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多