将CancellationToken传递给Task.Factory.StartNew()的目的是什么

时间:2016-11-09 22:24:43

标签: task-parallel-library .net-4.5 cancellation cancellation-token

在下面的代码中,CancellationToken作为第二个参数传递给.StartNew(,)方法,但只能由Action通过lambda中的闭包使用。那么,通过.StartNew(,)方法的第二个参数传递令牌的目的是什么?

var cts = new CancellationTokenSource();
var token = cts.Token;
Task.Factory.StartNew(() => 
{
    while (true)
    {
        // simulate doing something useful
        Thread.Sleep(100);
    }
}, token);

2 个答案:

答案 0 :(得分:4)

StartNew方法在胎面池中调度任务,但此时无需启动它,因为线程可能不可用。在等待启动期间,可能发生取消请求,之后线程池根本不会启动任务。任务开始后,你的工作是处理取消任务。

答案 1 :(得分:4)

实际上,传递给CancellationTokenTask.Run的{​​{1}}的目的是允许任务区分被取消由{{抛出的异常由于任何其他异常,1}}和失败

也就是说,如果在开始时传递的Taskfactory.StartNew抛出,则任务的状态为CancellationToken.ThrowIfCancellationRequested,而任何其他异常(甚至来自另一个CancellationToken)都会将其设置为Cancelled

此外,如果在任务实际启动之前取消了CancellationToken,则根本不会启动它。