首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多源任务取消

多源任务取消
EN

Stack Overflow用户
提问于 2011-06-07 17:13:22
回答 1查看 2.6K关注 0票数 6

我目前有一个应用程序,在这个应用程序中,我创建了一系列任务,这些任务一个接一个地执行,其中有一个取消源,它可以中断任务之间的执行(即在安全终止点)。目前,我只在释放管理类时才使用此取消源,作为一种干净和快速中止执行的方法。

现在我有了一个用例,在这个用例中,我希望创建一个自动超时来取消任务序列,以防操作符没有及时响应(一些任务等待操作员与物理机制的交互)。同时,如果管理类被处理,我仍然需要支持取消。我找到了CancellationTokenSource.CreateLinkedTokenSource,这听起来像是我所需要的,但我有一些顾虑:

  1. 多个任务系列可以并行执行,因此我需要为超时取消创建一个新的CancellationTokenSource,并为我开始的每个任务系列创建一个相关的链接源。CancellationTokenSource实现IDisposable,这意味着我需要持久化两个取消源,并在最后一个任务完成或任何子任务被取消或出错时释放它们。这似乎相当尴尬,即使使用匿名方法闭包的有用魔力(仍然有这些取消源正在传递)。
  2. 我还需要防止在计时器过期之前释放取消源的情况(因此我不会取消已释放的源)。这是一个潜在的竞争条件,所以我需要添加适当的锁定。这似乎也很尴尬,增加了相当大的复杂性(未来的维护成本),并使单元测试更具挑战性(竞争条件很难可靠地归纳出来)。

我是否走在正确的道路上,还是有更简单的方法来做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-07 17:21:55

问题中的核心问题似乎与在Dispose()和/或CancellationTokenSource对象上调用CancellationTokenSource有关。在这种情况下,我建议不要调用Dispose,这将大大简化您的设计。

作为理由,我将向您介绍这条线。特别是,Stephen Toub (负责任务的PM )建议您:

如果根据代码的结构进行处理是容易的和正确的,那么要积极地处理。如果您必须开始执行奇怪的循环才能进行释放(或者在任务的情况下,使用额外的同步来确保安全地处理,因为dispose可能只在任务完成后使用),那么最好依靠终结来处理事情。

这听起来就像他在结尾描述的那样--你试图做一些奇怪的旋转,以便调用这些对象上的Dispose()

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6269029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档