Task.WaitAll抛出OperationCanceledException

时间:2016-11-14 18:48:55

标签: c# multithreading task-parallel-library multitasking

我有一个具有相同CancellationTokenSource的正在运行的任务列表。

我希望当前线程等到所有任务完成,直到任务被取消。

Task.WaitAll(tasks.ToArray(), searchCencellationTokenSource.Token);
System.Console.WriteLine("Done !");

即使当前线程处于等待状态,任务也可能被其他任务取消。这是正常行为。

但是,当前线程处于等待状态而另一个任务取消任务时,WaitAll会抛出CancellationTokenSource并显示一条消息:"操作已取消。"。

我知道它被取消了,我故意这样做了。我只是希望它在任务被取消或完成后继续下一个代码,而不会抛出异常。

我知道我可以用try& amp封装此代码捕获,但抛出异常是繁重的操作,我不希望它发生在像这样的正常行为上。

1 个答案:

答案 0 :(得分:2)

这种阻止机制可以改为:

Element_Type

这为您提供了一个我们可以等待的任务,但也可以管理取消。因此,要忽略取消例外,您可以执行以下操作:

Task.WhenAll(taskA, taskB, taskC).Wait()

不会抛出Task.WhenAll(taskA, taskB, taskC).ContinueWith(t => { }, TaskContinuationOptions.OnlyOnCanceled).Wait();

然后可以将其包装到扩展方法中,如下所示:

OperationCancelledException

这将允许您再次编写以下内容,而不会遇到public static class TaskExtensions { public static Task IgnoreCancellation(this Task task) { return task.ContinueWith(t => { }, TaskContinuationOptions.OnlyOnCanceled); } }

OperationCancelledException

这是一个显示该方法有效的测试夹具:

Task.WhenAll(taskA, taskB, taskC).IgnoreCancellation().Wait();

希望它有所帮助。