【发布时间】:2019-10-11 15:27:49
【问题描述】:
我在 BackGroundWorker 中有一个非迭代代码,所以我无法检查 CancellationPendig。
代码如下。
Private Sub BgW1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BgW1.DoWork
Try
Dim conn As New MySqlConnection(My.Settings.MySQL_Cnn_Cfg)
Dim Adp As New MySqlDataAdapter
Dim TablaDatos As New DataTable
conn.Open()
Using cmd As New MySqlCommand()
cmd.CommandType = CommandType.Text
cmd.Connection = conn
cmd.CommandText = e.Argument
Adp.SelectCommand = cmd
TablaDatos.Clear()
Adp.Fill(TablaDatos)
e.Result = TablaDatos
End Using
Catch ex As Exception
e.Result = "Error!"
e.Cancel = True
End Try
End Sub
BackGroundWorker 接收一个查询字符串并返回一个 DataTable,如果远程服务器做出快速响应,它就可以工作,但是对于需要一些时间的复杂查询,我无法取消该过程,或者至少我不知道如何取消。
我已经试过了
BgW1.Dispose()
没有成功,所以还有另一种方法可以停止 BackGroundWorker?
【问题讨论】:
-
不,除了终止您的程序外,没有其他方法可以停止此代码。如果这真的很重要,那么进行一个又一个执行的较小查询。现在您可以检查 CancellationPending。当然要记住,你是为人类做的。他也不喜欢查看数千 个查询结果。让你的 UI 可用,你的代码也会受益。
-
可以为查询定义超时时间,并捕获异常
-
DataTable 不是由人类 bean 检查,因为必须对其进行处理,然后程序生成报告以发送给客户。 @SysDragon:我无法定义超时,因为我不在乎查询需要多少时间,但是如果用户想中止/取消该过程,因为即他必须回家或对查询进行一些更改才能完成更简单,他可以做到。