忙于处理单个代码行时取消后台工作程序?

时间:2013-01-26 11:54:23

标签: multithreading backgroundworker

如果工作人员仍在忙于处理单个代码行,有没有办法在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

1 个答案:

答案 0 :(得分:0)

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

  1. 利用Henk Holterman在answer中建议的图书馆中的一些支持 - 但我明白这不是你的情况;
  2. 正如Hans Passant和HackedByChinese的this answer所建议的那样,您可以生成一个新的任务/线程,您可以在其中执行工作并从DoWork处理程序轮询取消 - 当取消时请求,您只需忽略任务的结果(或以不干扰后续计算的方式管理它)。
  3. 如果process #2实际上是一个程序,您可以启动您的流程然后利用Process.WaitForExithttp://msdn.microsoft.com/en-us/library/ty0d8k56.aspx) - 也就是说,您等待一段时间让流程退出然后检查是否要求取消。