4

我们有一个长时间运行的操作,它由许多可以取消的点组成。如果我们要使用任务取消令牌方法,我们需要确保在每个需要的地方检查取消。

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

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

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

4

1 回答 1

5

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

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

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

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

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

于 2013-10-18T20:32:13.457 回答