关于异常的性能影响存在争议性意见。
但是,它似乎是使用ThrowIfCancellationRequested
取消任务的标准方法。
现在,如果我想一次取消1000个任务,ThrowIfCancellationRequested
仍然是合适的方式吗?
**编辑**
好的,我运行了测试,使用ThrowIfCancellationRequested是一个性能问题。由于TaskScheduler很聪明,因此1000个任务本身不是问题。
我仍然想知道是否有一个好的替代品没有ThrowIfCancellationRequested的性能劣势,但仍然具有Exceptions的优势(尽管有多个代码层次结构级别,但易于处理)?
答案 0 :(得分:0)
我不认为抛出是问题,而是你的1000个任务。由于调度程序无法一次运行所有任务,因此必须对大部分任务进行排队。当他们共享一个CancellationToken
时,所有正在运行的任务都将被取消。然后调度程序将运行将立即取消的排队任务。这是低效的,因为你让调度程序完成所有工作只是为了取消任务。
运行任务时是否通过CancellationToken
?您可能想要这样做,因此他的调度程序知道取消。我建议的是不要一次安排所有任务。将它们切成块并使用Task.ContinueWith
,您可以在其中阻止任务完全运行。