【发布时间】:2011-09-10 06:34:16
【问题描述】:
我目前有一个应用程序,我在其中创建一系列任务,这些任务一个接一个地执行,取消源可以中断任务之间的执行(即在安全终止点)。我目前仅在管理时使用此取消源类是 Disposed,作为一种干净、快速地中止执行的方法。
我现在有一个用例,我想创建一个自动超时来取消任务序列,以防操作员没有及时响应(一些任务等待操作员与物理机制的交互.) 同时,如果管理类是 Disposed,我仍然需要支持取消。我找到了CancellationTokenSource.CreateLinkedTokenSource,这听起来像是我需要的,但我有一些顾虑:
多个任务系列可以并行执行,因此我需要为超时取消创建一个新的 CancellationTokenSource,并为我开始的每个任务系列创建一个关联的链接源。 CancellationTokenSource 实现 IDisposable,这意味着我需要保留两个取消源并在最后一个任务完成或任何子任务被取消或故障时处置它们。这似乎相当尴尬,即使有匿名方法闭包的有用魔法(仍然有这些取消源被传递。)
我还需要防止在计时器到期之前释放取消源的情况(所以我不取消已释放的源。)这是一个潜在的竞争条件,所以我需要添加适当的锁定.这似乎也很尴尬,增加了显着的复杂性(未来的维护成本)并使单元测试更具挑战性(竞争条件很难可靠地诱导。)
我是走在正确的道路上还是有更简单的方法可以做到这一点?
【问题讨论】:
标签: c# .net task task-parallel-library cancellation