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

bel*_*hin 4 c# task-parallel-library

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

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

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

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

Ree*_*sey 5

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

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

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

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

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