【问题标题】:Cancel Backgroundworker when busy processing a single code line?忙于处理单个代码行时取消Backgroundworker?
【发布时间】:2013-01-26 11:54:22
【问题描述】:

如果工作人员仍在忙于处理单个代码行,是否有任何方法可以在 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

【问题讨论】:

  • 这是不可能的,你需要修复这个错误。如果不能,则需要在另一个可以 Kill() 的进程中运行此代码。
  • 我在 Backgroundworker 的 DoWork 中使用了第 3 方 dll。那是那个dll的一个错误:(。为什么Backgroundworker在线程中没有像Join()这样的东西:(

标签: multithreading backgroundworker


【解决方案1】:

你可以通过两种方式解决这个问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多