将取消令牌传递给调用方法VS任务构造函数?

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

标签: c# .net multithreading task-parallel-library cancellation-token

传递取消令牌的一种方法是:

/* Cancellation token passed as method parameter */
Task task = Task.Run( () => { LongTask(1000000, cancellationToken.Token); });

另一种方式是:

/* Cancellation Token passed as task constructor */
Task task = Task.Run( () => { LongTask(1000000); }, cancellationToken.Token);

有什么区别?

1 个答案:

答案 0 :(得分:7)

第一个将令牌传递给您的方法,您可以在其中执行所需的操作。第二个将令牌传递给Task.Run,将任务与该令牌相关联。

由于.NET中的取消是合作Task.Run只能取消您的任务,如果它还没有开始执行(这不是那么有用)并且您的方法只能检查令牌的时间如果要求取消,则计时和抛出,但这会将任务标记为出错而不是取消。

要获得完整的解决方案,您应该同时执行这两项操作:

var task = Task.Run(() => LongTask(1000000, cancellationToken), cancellationToken);

这样,任务就与令牌相关联,您可以检查令牌是否取消。

相关问题