【问题标题】:How to cancel a non iterative BackGroundWorker如何取消非迭代 BackGroundWorker
【发布时间】: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:我无法定义超时,因为我不在乎查询需要多少时间,但是如果用户想中止/取消该过程,因为即他必须回家或对查询进行一些更改才能完成更简单,他可以做到。

标签: vb.net backgroundworker


【解决方案1】:

不,你不能。

我能看到这个工作的唯一方法是,如果你有 IDMySQL 连接,以及另一个按钮,当你单击它时会终止该进程,从这个意义上说,查询将停止并且后台工作人员将完成.

【讨论】:

  • 我怎样才能得到那个ID?
  • 因此,如果您打开连接,将连接 ID 分配给变量,然后在后台工作人员之外执行一条 sql 语句,该语句会简单地杀死进程(ID 号)
  • 也许它是一个更好的选择, "kill query thread_id" ,然后连接保持不变但终止当前查询。
  • 好的,很高兴我能帮上忙!
猜你喜欢
  • 2023-03-23
  • 2014-06-26
  • 2015-01-21
  • 1970-01-01
  • 2012-03-27
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多