我必须在任何表上显示许多事务。处理需要很长时间。 我想在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
答案 0 :(得分: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