Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 替换ThrowIfCancellationRequested()以取消1000个任务?_C#_Performance_Exception_Task_Cancellation Token - Fatal编程技术网

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

C# 替换ThrowIfCancellationRequested()以取消1000个任务?,c#,performance,exception,task,cancellation-token,C#,Performance,Exception,Task,Cancellation Token,对于异常的性能影响,存在着争议性的观点 但是,使用throwifcancellationrequest来取消任务似乎是一种标准方法 现在,如果我想一次取消1000个任务,ThrowIfCancellationRequested仍然是合适的方法吗 **编辑** 好的,我运行了测试,使用ThrowIfCancellationRequested是一个性能问题。1000个任务本身不是问题,因为TaskScheduler很聪明 我仍然想知道是否有好的替代品没有ThrowIfCancellationRequ

对于异常的性能影响,存在着争议性的观点

但是,使用
throwifcancellationrequest
来取消任务似乎是一种标准方法

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

**编辑**

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


我仍然想知道是否有好的替代品没有ThrowIfCancellationRequested的性能缺点,但仍然有异常的优点(尽管有几个代码层次结构级别,但易于处理)?

我不认为抛出是问题,但您的1000个任务。由于调度程序不能同时运行所有任务,因此它必须对其中的大多数任务进行排队。当它们共享一个
取消令牌时,所有正在运行的任务都将被取消。然后,调度程序将运行队列中的任务,这些任务将立即被取消。这是低效的,因为你让调度器做所有的工作只是为了取消任务


运行任务时是否传递了
CancellationToken
?你可能想这么做,这样他就知道取消了。我建议不要同时安排所有的任务。将它们切成块并使用
Task.ContinueWith
,这样可以防止任务一起运行

我不认为掷骰子是个问题,但是你的1000个任务。由于调度程序不能同时运行所有任务,因此它必须对其中的大多数任务进行排队。当它们共享一个
取消令牌时,所有正在运行的任务都将被取消。然后,调度程序将运行队列中的任务,这些任务将立即被取消。这是低效的,因为你让调度器做所有的工作只是为了取消任务


运行任务时是否传递了
CancellationToken
?你可能想这么做,这样他就知道取消了。我建议不要同时安排所有的任务。将它们切成块并使用
Task.ContinueWith
,这样可以防止任务一起运行

您可能需要运行一个测试来尝试。1000个任务是巨大的,单是这一项就可能导致性能问题。好的,我运行了测试,使用
throwifcancellationrequest
是一个性能问题。1000个任务本身不是问题,因为TaskScheduler很聪明。我仍然想知道是否有好的替代品,它不具有通过取消安装请求的性能缺点,但仍然具有异常的优点(尽管存在多个代码层次结构级别,但易于处理)?您可能希望运行一个测试来尝试。1000个任务是巨大的,单是这一项就可能导致性能问题。好的,我运行了测试,使用
throwifcancellationrequest
是一个性能问题。1000个任务本身不是问题,因为TaskScheduler很聪明。我仍然在想,是否有好的替代品不具有通过取消安装请求的性能缺点,但仍然具有异常的优点(尽管有几个代码层次结构级别,但易于处理)?不,1000个任务不是什么大问题。如果我使用
If(iscancellationrequest)返回每项任务需要0.15毫秒(1000项任务需要150毫秒)。但是,如果我使用
ThrowIfCancellationRequested
,则每个任务需要11毫秒(11000毫秒=11秒,1000个任务)。如果使用
ContinueWith
,您仍然不会遇到这些问题,因为您必须执行
ThrowIfCancellationRequested
的频率要低得多。不,1000个任务不是什么大问题。如果我使用
If(iscancellationrequest)返回每项任务需要0.15毫秒(1000项任务需要150毫秒)。但是,如果我使用
ThrowIfCancellationRequested
,则每个任务需要11毫秒(11000毫秒=11秒,1000个任务),如果您使用
ContinueWith
,您仍然不会遇到这些问题,因为您将不得不执行
ThrowIfCancellationRequested