我已经搜索过SO和Google,但找不到所需的信息,这可能表明我没有正确使用后台工作人员。就我而言,我在后台工作程序中运行SQL查询,因此GUI不会为用户冻结。请注意,supportscancellation设置为true。
但是,如果用户想要取消查询,我试图停止后台工作程序。因为我的后台工作人员没有循环,所以我不确定该如何完成。
我的后台工作人员只是查看一个布尔值以确定SQL查询的类型,然后调用另一个事件来运行它。
Sub BackgroundWorker1DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs)
If Psearch = True Then
P_Search()
End If
If Asearch = True Then
A_Search()
End If
If Msearch = True Then
M_Search()
End If
If Dsearch = True Then
D_Search()
End If
End Sub
根据我发现的文章,似乎添加了if语句来检查是否取消取消,因为它只会触发一次(在RunWorkerAsync的开始)。因此,我尝试使用For / Do循环来检查是否有待取消或工作完成的对象,但是它仍然不会取消和处理后台工作人员。我已经通过尝试重新启动后台工作程序来验证了这一点,但是由于工作人员忙碌而导致我出错了。
Sub Button7Click(sender As Object, e As EventArgs)
If backgroundWorker1.IsBusy() Then
backgroundWorker1.CancelAsync()
backgroundWorker1.Dispose()
End If
End Sub
Sub D_Search()
Dim sqlConnection1 As New SqlConnection(GlobalConString)
Dim cmd As New SqlCommand
cmd.CommandText = RealQuery
cmd.CommandTimeout = 0
cmd.Connection = sqlConnection1
sqlConnection1.Open()
Dim daQuery As New System.Data.SqlClient.SqlDataAdapter(cmd)
Dim dsQuery As New DataSet
Try
If backgroundWorker1.CancellationPending = False
daQuery = New System.Data.SqlClient.SqlDataAdapter
daQuery.SelectCommand = cmd
daQuery.Fill(dsQuery, "Query")
tblQuery = dsQuery.Tables("Query")
Else
backgroundWorker1.Dispose()
sqlConnection1.Close()
End If
Catch Err As System.Exception
MessageBox.Show(Err.ToString)
Finally
sqlConnection1.Close()
End Try
End Sub