我创建了一个后台线程来获取数据并将其返回给主线程;这很有效。现在我希望能够从主线程中停止SQL请求(可能是单击按钮)。
这是我创建线程(工作)的测试代码:
Private Sub GetSql()
If (Me.InvokeRequired) Then
Me.Invoke(New GetSqlDelegate(AddressOf GetSql))
Else
Dim da As SqlDataAdapter = New SqlDataAdapter("select * from database", _
New SqlConnection(connectionString))
dt = New DataTable
da.Fill(dt)
Me.BeginInvoke(New BindDataToGridDelegate(AddressOf BindDataToGrid))
End If
End Sub
Private Delegate Sub BindDataToGridDelegate()
Private Sub BindDataToGrid()
DataGridView1.DataSource = dt
dt = Nothing
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
thrGetData = New Thread(AddressOf ThreadBackgroundData)
thrGetData.IsBackground = True
thrGetData.Start()
End Sub
如何访问后台线程以按需停止查询?
我是否需要在主线程上设置一个标志,告诉后台线程停止运行然后让后台线程每隔一段时间轮询一次主线程?
任何帮助将不胜感激。我试图寻找一个例子,但我找不到一个好的。即使伪代码也会有帮助
感谢。
答案 0 :(得分:0)
DataAdapter.Fill方法是同步的,这意味着它会阻止当前线程,直到它完成。基本上,这意味着您无法在后台线程中添加轮询/检查,因为它可以执行的所有操作都是执行Fill方法(这可能非常耗时)。
如果您的问题是停止操作本身(请注意,不会返回任何数据),您应该从主线程调用thread.Abort()。为此,您需要将thrGetData保存为类级变量。有关Thread.Abort()的更多信息,请参见here。