1

2 つのタスクがあります。

try
{
    List<Task> tasks = new List<Task>();

    Task task1 = Task.Factory.StartNew(() => func(param));
    tasks.Add(task1);
    if (someCondition)
    {
        Task task2 = Task.Factory.StartNew(() => func2(param2));
        tasks.Add(task2);
     }

     tasksArr = tasks.ToArray();

     Task.WaitAll(tasksArr);
 }
 catch (AggregateException e)
 {
     //handle
 }
 catch (Exception)
 {
     //handle
 }

タスクの 1 つで例外が発生した場合、新しい集計例外をスローしていますが、2 番目のタスクが終了した後にのみ catch ステートメントに到達しています。2番目のタスクで不要な作業を停止するために、すぐにキャッチしたい。

キャンセルトークンを使用しようとしました:

CancellationTokenSource cts = new CancellationTokenSource();

Task.WaitAll(tasksArr,cts.Token);

しかし、内部例外が処理される必要があり、キャッチされた例外がOperationCanceledException

何か案は?

4

1 に答える 1

0

CancellationTokenSource待機をキャンセルするには、クラスのインスタンスをTask.WaitAll Method (Task[], CancellationToken)に渡す必要があります。また、タスクが失敗したとき (障害など) に実行される各タスクで継続TaskStatus.Faultedを使用します。

var cancellationTokenSource = new CancellationTokenSource();

var tasks = new List<Task>();

var firstTask = new Task(FirstMethod);
firstTask.ContinueWith(t =>
    {
        Console.WriteLine("First task exception: {0}", t.Exception);
        cancellationTokenSource.Cancel();
    }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.Default);
tasks.Add(firstTask);
firstTask.Start();

var secondTask = new Task(SecondMethod);
secondTask.ContinueWith(t =>
    {
        Console.WriteLine("Second task exception: {0}", t.Exception);
        cancellationTokenSource.Cancel();
    }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.Default);
tasks.Add(secondTask);
secondTask.Start();

try
{
    var cancellationToken = cancellationTokenSource.Token;
    var tasksArray = tasks.ToArray();
    Task.WaitAll(tasksArray, cancellationToken);
}
catch (Exception e)
{
    // ...
}
于 2013-10-14T13:41:48.530 に答える