当任何这些任务抛出异常时,如何取消一堆任务?

时间:2012-11-02 14:24:42

标签: .net multithreading task-parallel-library

我创建并启动了许多任务。 其中一项任务可以抛出异常。如果发生这种情况,我需要停止所有任务。

现在我只看到执行此操作的唯一方法是将CancellationTokenSource传递给每个任务并在catch块中调用Cancel()。

TPL是否以更通用的方式支持所需的功能?

类似的东西:

Action<Task> onExceptionAction = t => cancellationTokenSource.Cancel();
var task = Task.WhenAnyThrows<MyException>(tasks, onExceptionAction);

如果没有抛出异常,则认为任务已完成(或取消)

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您需要的是ContinueWith() TaskContinuationOptions.OnlyOnFaulted

因此,您的方法可能如下所示:

void CancelWhenAnyFaults(IEnumerable<Task> tasks, CancellationTokenSource cts)
{
    foreach (var task in tasks)
        task.ContinueWith(
            _ => cts.Cancel(), cts.Token, TaskContinuationOptions.OnlyOnFaulted,
            TaskScheduler.Current);
}

我也将CancellationToken传递给ContinueWith(),以便当一个任务失败时,不执行其他延续。