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

本文关键字:取消 长时间 操作 运行 何取消 | 更新日期: 2023-09-27 18:35:56

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

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

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

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

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

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

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

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

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

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