我创建并启动了许多任务。 其中一项任务可以抛出异常。如果发生这种情况,我需要停止所有任务。
现在我只看到执行此操作的唯一方法是将CancellationTokenSource传递给每个任务并在catch块中调用Cancel()。
TPL是否以更通用的方式支持所需的功能?
类似的东西:
Action<Task> onExceptionAction = t => cancellationTokenSource.Cancel();
var task = Task.WhenAnyThrows<MyException>(tasks, onExceptionAction);
如果没有抛出异常,则认为任务已完成(或取消)
答案 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()
,以便当一个任务失败时,不执行其他延续。