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

Sea*_*n B 6 task-parallel-library cancellation .net-4.5 cancellation-token

在下面的代码中,a 作为第二个参数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);
Run Code Online (Sandbox Code Playgroud)

VMA*_*Atm 5

StartNew方法在胎面池中计划任务,但由于线程可能不可用,因此不必立即启动它。在等待启动期间,可能会发生取消请求,此后线程池根本不会启动任务。任务启动后,处理任务取消是您的工作。


Hau*_*ger 5

实际上,CancellationToken传递给Task.Run和的目的Taskfactory.StartNew是允许任务区分因其他任何异常引发的异常而取消CancellationToken.ThrowIfCancellationRequested失败

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

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