我正在尝试运行一个后台工作程序来加载我的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
答案 0 :(得分:0)
http://msdn.microsoft.com/en-us/library/hybbz6ke.aspx
我将从上面的链接开始,更具体地说是示例代码中的注释: '不要直接访问表单的BackgroundWorker引用。 '而是使用sender参数提供的引用。
您必须将该引用传递给Load()方法。 作为一般规则,不要直接在父线程上访问任何内容。 所有通信都需要通过各种EventArgs参数的实例进行。
除非您了解DoWorkEventArgs,ProgressChangedEventArgs,RunWorkerCompletedEventArgs,否则您将无法真正理解如何使用后台工作程序