如何取消可在多点取消的长时间运行操作?

时间:2013-10-18 20:28:59

标签: c# task-parallel-library

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

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

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

1 个答案:

答案 0 :(得分:5)

  

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

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

全局令牌不能解决每个所需位置的检查问题,并且只能帮助不将令牌作为参数传递给方法。它确实限制了你 - 如果你使用全局令牌,你就可以现在或将来修改你的例行程序,以便在飞行中进行多项操作并单独取消。

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

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