【发布时间】:2012-11-02 14:24:41
【问题描述】:
我创建并启动了许多任务。 其中一项任务可能会引发异常。如果发生这种情况,我需要停止所有任务。
现在我只看到唯一的方法是将 CancellationTokenSource 传递给每个任务并在 catch 块中调用 Cancel()。
TPL 是否以更通用的方式支持所需的功能?
类似:
Action<Task> onExceptionAction = t => cancellationTokenSource.Cancel();
var task = Task.WhenAnyThrows<MyException>(tasks, onExceptionAction);
如果没有抛出异常,则认为任务完成(或取消)
【问题讨论】:
-
在我看来,取消支持非常通用。您只需要一个
CancellationTokenSource即可传递给所有任务。您只需在该令牌上调用一次Cancel即可取消所有使用它的任务。对我来说似乎很笼统。 -
嗯,没关系,但是如果你有一些任务制作人呢?您从它那里收到带有关联 CancellationTokenSource 的可取消任务。在这种情况下,您无法控制此任务中的异常处理。您可以使用调用 CreateLinkedTokenSource 方法创建的链接 CTS 取消此任务。不过,您不能在任务中嵌入取消操作。是的,这个例子有点人为但似是而非。
标签: .net multithreading task-parallel-library