如何取消一个可以在多个节点上被取消的长时间运行操作?

4
我们有一个长时间运行的操作,由许多��以取消的点组成。如果我们使用任务取消令牌方法,我们需要确保在每个必要的地方检查是否已取消。
这对我们来说似乎不是最佳选择。我们看到两个问题:
1.我们需要在每个可能取消的地方进行取消令牌检查,这会使代码混杂不清,存在错过其他取消机会的风险。
2.如果我们遵循避免全局变量的指南,我们需要将取消令牌作为参数传递给许多方法,这也会使代码变得冗长。
应该使用全局取消令牌来处理第二个问题吗?应该使用AppDomain来处理第一和第二个问题吗?
1个回答

5
我们需要确保在每个必要的地方检查取消操作,这是处理此问题的正确方式。全局标记并不能解决在每个必要的地方进行检查,并且只有可能帮助不将标记作为参数传递给方法。它会限制你——如果使用全局标记,则会剥夺您现在或将来修改例程以具有多个正在运行的操作和单独取消的能力。
然而,我认为传递标记实际上是一件好事。这使得您的API自我记录——每个接受标记的方法都可能引发OperationCanceledException并支持取消。
任何避免这些问题的其他方法都需要一个不合作的取消模型。这会产生不良的副作用,因为强制“终止”正在运行的操作很少是一件好事(例如,有许多理由避免Thread.Abort,这很容易找到)。

关于使用AppDomain,您有什么要说的吗? - beluchin
1
@beluchin 这有点取决于你所说的“使用AppDomain”的含义 - 但我在最后一段中已经解决了这个问题... - Reed Copsey
1
完全同意这个答案。这是应该遵循的正确模式。我认为这种方法并没有“弄乱”代码,将令牌作为参数传递给每个参与方法实际上使合同清晰明确,表明该方法支持取消。 - X.J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接