0

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

现在我只看到这样做的唯一方法是将 CancellationTokenSource 传递给每个任务并在 catch 块中调用 Cancel() 。

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

就像是:

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

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

4

1 回答 1

2

如果我理解正确的话,你想要的是ContinueWith()with TaskContinuationOptions.OnlyOnFaulted

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

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

我也传递了CancellationTokento ContinueWith(),这样当一个任务失败时,其他的延续就不会被执行。

于 2012-11-05T18:30:31.463 回答