1

如果工作人员仍在忙于处理单个代码行,是否有任何方法可以在 x 秒后(即超时 5 秒)取消后台工作人员?(永远不要到 While 循环的末尾检查 CancellationPending)?例子:

Private Sub DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
        Dim worker As BackgroundWorker = DirectCast(sender, BackgroundWorker)
        While Not worker.CancellationPending
            Dim args As ArgumentType = CType(e.Argument, ArgumentType)
            Try
            process #1
            process #2 --> hanging here. Never throw exception.
            ...
            process #n

            Catch ex as Exception
            'Never come here
            End Try
        End While
End Sub
4

1 回答 1

0

您可以通过两种方式解决此问题:

  1. 通过利用 Henk Holterman 在这个答案中建议的图书馆中的一些支持——但我知道这不是你的情况;
  2. 正如 Hans Passant 和 HackedByChinese 的回答所建议的那样,您可以生成一个新的任务/线程,您可以在其中完成工作并轮询DoWork处理程序的取消 - 当请求取消时,您只需忽略任务的结果(或以不干扰后续计算的方式对其进行管理)。
  3. 如果process #2实际上是一个程序,您可以启动您的进程,然后利用Process.WaitForExit( http://msdn.microsoft.com/en-us/library/ty0d8k56.aspx ) - 也就是说,您等待一段时间让进程退出,然后检查是否请求取消。
于 2013-05-03T18:01:05.870 回答