0

私は多くのタスクを作成して開始します。タスクの1つが例外をスローする可能性があります。これが発生した場合、すべてのタスクを停止する必要があります。

これを行う唯一の方法は、CancellationTokenSourceを各タスクに渡し、catchブロックでCancel()を呼び出すことです。

TPLは、より一般的な方法で必要な機能をサポートしていますか?

何かのようなもの:

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

また、例外がスローされない場合、タスクは完了(またはキャンセル)されたと見なされます

4

1 に答える 1

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()、1つのタスクが失敗したときに、他の継続は実行されません。

于 2012-11-05T18:30:31.463 に答える