无法取消运行SQL查询的后台工作程序

时间:2019-01-17 18:13:51

标签: vb.net

我已经搜索过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

0 个答案:

没有答案