0

我必须在任何表上显示很多事务。处理需要很长时间。 我想在visual basic 2010中使用后台进程,但它总是会提供一个类似于“检测到跨线程操作”的错误消息。我尝试了很多我在互联网上找到的方式,但仍然无法找到问题所在。 请帮我解决这个问题。 这是我的代码:使用后台工作VB.NET

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 
+0

我是为英语不好 – christ2702

+0

'昏暗的工人作为BackgroundWorker'在DoWork的抱歉..尝试删除或使其作为注释 – matzone

+0

它给出了同样的错误 – christ2702

回答

0

我想是因为里面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