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

Mar*_*k S 7 .net c# multithreading task-parallel-library cancellation-token

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

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

另一种方式是:

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

有什么不同?

i3a*_*non 7

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

由于.NET中的取消是合作的Task.Run,只有当它还没有开始执行时才能取消你的任务(这不是那么有用),并且你的方法只能不时地检查令牌并且如果请求取消则抛出但是这将标记任务有问题而不是取消.

要获得完整的解决方案,您实际上应该同时执

var task = Task.Run(() => LongTask(1000000, cancellationToken), cancellationToken);
Run Code Online (Sandbox Code Playgroud)

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