WPF BackgroundWorker - UI锁定尝试从外部类实例化对象

时间:2011-04-13 13:33:22

标签: .net wpf vb.net

我正在尝试运行一个后台工作程序来加载我的DAL数据(可以在另一个类中使用)。我希望保持UI可用,并且在加载对象时没有“锁定”的感觉。

当我创建一个简单的背景工作者和睡眠时,UI保持响应,我的控件可以在睡眠后更新。一旦我通过调用从DAL实例化对象来替换sleep,UI就会锁定。有没有我可以使用后台工作实例化这个对象并保持UI响应?

当情境对象被实例化时,它可能需要几秒钟才能完全加载,在此期间是UI被锁定...它最终会加载正常。

Private WithEvents backWork As New BackgroundWorker()
Dim sit As Situation

Private Sub btnLoad_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnLoad.Click

    backWork.RunWorkerAsync()

End Sub

Private Sub backWork_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles backWork.DoWork
    Load()
End Sub

Private Sub backWork_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles backWork.ProgressChanged
    lblLoading.Visibility = Visibility.Visible
End Sub

Private Sub backWork_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles backWork.RunWorkerCompleted
    tab1.DataContext = sit
    lblLoading.Visibility = Visibility.Hidden
End Sub

Private Sub Load()
    backWork.WorkerReportsProgress = True
    backWork.ReportProgress(1)

    sit = New Situation

End Sub

1 个答案:

答案 0 :(得分:0)

http://msdn.microsoft.com/en-us/library/hybbz6ke.aspx

我将从上面的链接开始,更具体地说是示例代码中的注释: '不要直接访问表单的BackgroundWorker引用。 '而是使用sender参数提供的引用。

您必须将该引用传递给Load()方法。 作为一般规则,不要直接在父线程上访问任何内容。 所有通信都需要通过各种EventArgs参数的实例进行。

除非您了解DoWorkEventArgs,ProgressChangedEventArgs,RunWorkerCompletedEventArgs,否则您将无法真正理解如何使用后台工作程序