8

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

/* 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);

有什么区别?

4

1 回答 1

7

第一个将令牌传递给您的方法,您可以在其中做任何您想做的事情。第二个将令牌传递给Task.Run将任务与该令牌相关联的那个。

由于 .NET 中的取消是协作Task.Run的,因此只能在尚未开始执行的情况下取消您的任务(这不是那么有用),并且您的方法只能不时检查令牌并在请求取消时抛出,但这将标记任务出错而不是取消。

要获得完整的解决方案,您实际上应该同时执行以下两项操作:

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

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

于 2016-06-18T15:07:12.990 回答