【问题标题】:Using Background Worker VB.NET使用后台工作者 VB.NET
【发布时间】:2014-03-13 07:40:05
【问题描述】:

我必须在任何桌子上显示许多交易。需要很长时间来处理。 我想在 Visual Basic 2010 中使用后台进程,但它总是给出类似“检测到跨线程操作”的错误消息。我尝试了很多我在互联网上找到的方法,但仍然找不到问题所在。 请帮助我解决这个问题。 这是我的代码:

Private Sub CHK_A_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CHK_A.CheckedChanged
        Disabled()
        P_Panel.Visible = True
        B_Worker.RunWorkerAsync()

    End Sub

Private Sub BTN_Search_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_Search.Click

        USP_Select_Registration()
    End Sub

    Private Sub B_Worker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles B_Worker.DoWork

        Threading.Thread.Sleep(25)
        USP_Select_Registration()

    End Sub

    Private Sub B_Worker_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles B_Worker.RunWorkerCompleted
        P_Panel.Visible = False
    End Sub

这是我的存储过程

Public Sub USP_Select_Registration()
        Dim Con As New SqlConnection(SQLCon)
        Try
            Con.Open()
            Dim Cmd As New SqlCommand("USP_Select_Registration", Con)
            Cmd.CommandType = CommandType.StoredProcedure
            Cmd.Parameters.Add("@Check", SqlDbType.Bit).Value = CHK_A.EditValue
            Cmd.Parameters.Add("@Month", SqlDbType.Int).Value = CBO_Month.SelectedIndex + 1
            Cmd.Parameters.Add("@Year", SqlDbType.Int).Value = SPE_Year.EditValue
            Cmd.Parameters.Add("@Search", SqlDbType.VarChar, 150).Value = TXT_Search.Text
            DS_Registration.Tables("MST_Registration").Clear()
            Dim Adt As New SqlDataAdapter(Cmd)
            Adt.Fill(DS_Registration.Tables("MST_Registration"))
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")
        Finally
            Con.Close()
        End Try
    End Sub

【问题讨论】:

  • 我很抱歉英语不好
  • Dim worker As BackgroundWorker in dowork .. 尝试删除或将其设为评论
  • 它给出了同样的错误
  • 尝试对 btn_search_click 执行相同操作 ...
  • 它没有任何区别,实际上我已经全部删除了(Dim worker As BackgroundWorker)

标签: vb.net multithreading visual-studio-2010 backgroundworker background-process


【解决方案1】:

我认为你得到错误是因为在USP_Select_Registration 内部你试图从表单控件中读取值。这是由另一个线程创建的。

RunWorkComleted 在创建Backgroundworker 的同一线程中执行,这就是代码P_Panel.Visible = False 将正常执行的原因。

但是DoWork 在另一个线程上执行。
当您尝试访问某些表单控件以读取值时
TXT_Search.Text - 它会引发错误

您可以将搜索参数传递给BackgroundWorker,但您需要在USP_Select_Registration函数中添加参数。

例如:

Private Sub USP_Select_Registration(searchText as String)
    'Your code here
End Sub

那么你从哪里开始BackgroundWorker

B_Worker.RunWorkerAsync(TXT_Search.Text)

Private Sub B_Worker_DoWork(ByVal sender As Object, 
                            ByVal e As DoWorkEventArgs) Handles B_Worker.DoWork

    Threading.Thread.Sleep(25)
    USP_Select_Registration(e.Argument)

End Sub

在您的情况下,您需要传递多个参数。
因此,您可以创建一些结构/类或任何可以保留所有需要值的对象。并将该对象传递给RunWorkerAsync

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多