替换ThrowIfCancellationRequested()以取消1000个任务?

时间:2016-11-18 10:28:07

标签: c# performance exception task cancellation-token

关于异常的性能影响存在争议性意见。

但是,它似乎是使用ThrowIfCancellationRequested取消任务的标准方法。

现在,如果我想一次取消1000个任务,ThrowIfCancellationRequested仍然是合适的方式吗?

**编辑**

好的,我运行了测试,使用ThrowIfCancellationRequested是一个性能问题。由于TaskScheduler很聪明,因此1000个任务本身不是问题。

我仍然想知道是否有一个好的替代品没有ThrowIfCancellationRequested的性能劣势,但仍然具有Exceptions的优势(尽管有多个代码层次结构级别,但易于处理)?

1 个答案:

答案 0 :(得分:0)

我不认为抛出是问题,而是你的1000个任务。由于调度程序无法一次运行所有任务,因此必须对大部分任务进行排队。当他们共享一个CancellationToken时,所有正在运行的任务都将被取消。然后调度程序将运行将立即取消的排队任务。这是低效的,因为你让调度程序完成所有工作只是为了取消任务。

运行任务时是否通过CancellationToken?您可能想要这样做,因此他的调度程序知道取消。我建议的是不要一次安排所有任务。将它们切成块并使用Task.ContinueWith,您可以在其中阻止任务完全运行。