如何使用Backgroundworker加载表单?

时间:2013-02-25 17:45:37

标签: vb.net multithreading

当我尝试使用backgroundworker类加载表单时,它会抛出异常,因为我试图访问由另一个线程创建的对象,而不是当前线程。如何通过backgroundworker加载该表单?

(我正在加载表单时寻找选框进度条)

4 个答案:

答案 0 :(得分:1)

您无法更改backgroundworker的DoWork部分中的任何控件,因为它是一个单独的线程。您需要处理DoWork部分中的任何数据,然后在RunWorkerCompleted部分更新您的表单。

示例:

Private WithEvents bgwTasks As New BackgroundWorker

Private Sub bgwTasks_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwTasks.DoWork
e.Result= GetDatabaseTable()
End Sub

Private Sub bgwTasks_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwTasks.RunWorkerCompleted
    If e.Result IsNot Nothing Then
        DataGridView1.DataSource = e.Result
    End If
End Sub

Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If bgwTasks.IsBusy = False Then
        bgwTasks.RunWorkerAsync()
    End If
End Sub

答案 1 :(得分:0)

这将禁用检查交叉线程

Me.CheckForIllegalCrossThreadCalls = False

我仍然建议您搜索有关正确使用BackgroundWorker类的Cross Thread。

答案 2 :(得分:0)

在另一个线程中初始化第二个表单没有问题,但是如果要在主表单的上下文中使用它,则必须使用原始线程。下面的代码在后台worker中创建并初始化新表单,然后在适当的事件处理程序中完成初始化时显示它:

Public Class Form1
Dim form2 As Form2

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    form2 = New Form2()
    form2.TextBox1.Text = "Text"
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    form2.Show()
End Sub
End Class

您可以使用后台工作程序的 ProgressChanged 事件来报告进度条。

答案 3 :(得分:0)

你不能这样做。表单具有线程亲和力。即。它们只能由实例化Form的线程访问。你的后台线程刚刚成为表单的UI线程! 所以你必须做的是将调用编组到正确的线程上。 测试InvokeRequired。如果为true,则实例化委托,调用BeginInvoke并返回IMMEDIATELY。 现在,调用将被编组到正确的线程。