【问题标题】:How to cancel a long-running operation that can be cancelled at many points?如何取消可以在多个点取消的长时间运行的操作?
【发布时间】:2014-01-07 05:10:08
【问题描述】:

我们有一个长期运行的操作,其中包含许多可以取消的点。如果我们要使用任务取消令牌方法,我们需要确保在每个需要的地方检查取消。

这对我们来说似乎不是最理想的。我们在这里看到两个问题:

  1. 我们需要在每个有取消机会的地方进行取消令牌检查,我们觉得这会使代码混乱,并且有可能错过代码中的点 还有其他取消机会。
  2. 如果我们遵循指南来避免使用全局变量,我们需要将取消标记作为参数传递给我们认为重复且使代码混乱的许多方法。

我们是否应该使用全局取消令牌来处理 2.?我们应该使用AppDomain来处理1.和2.吗?

【问题讨论】:

    标签: c# task-parallel-library


    【解决方案1】:

    我们需要确保在每个需要的地方检查取消。

    这确实是处理这个问题的正确方法。

    全局标记不能解决在每个需要的地方进行检查,并且只会潜在地帮助不将标记作为参数传递给方法。它确实限制了您 - 如果您使用全局令牌,您现在或将来无法修改您的例程以在运行中进行多个操作并单独取消。

    但是,我认为传递令牌实际上是一件好事。这使您的 API 可以自我记录 - 每个接受令牌的方法都可能引发 OperationCanceledException 并支持取消。

    任何其他避免这些问题的方法都需要一个不合作的取消模型。这会产生不利的副作用,因为强行“杀死”正在运行的操作很少是好事(例如,有很多原因可以避免使用很容易找到的 Thread.Abort)。

    【讨论】:

    • 关于使用AppDomain有什么要说的吗?
    • @beluchin 这有点取决于你所说的“使用 AppDomain”是什么意思——但我在上一段中确实提到了这个......
    • 完全同意这个答案。这是要遵循的正确模式。我不认为这种方法“混乱”了代码,将令牌作为参数传递给每个参与方法实际上使合同清楚明确地表明该方法支持取消。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2011-03-03
    • 2021-10-29
    • 2014-08-29
    • 1970-01-01
    • 2013-01-21
    相关资源
    最近更新 更多