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

What is the purpose of passing CancellationToken to Task.Factory.StartNew()

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

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

StartNew 方法在线程池中调度任务,但不必立即启动它,因为线程可能不可用。在等待启动期间,可能会出现取消请求,之后线程池根本不会启动任务。任务启动后,您的工作就是处理任务的取消。

实际上,CancellationToken传递给Task.RunTaskfactory.StartNew的目的是让任务区分被取消 CancellationToken.ThrowIfCancellationRequested 因任何其他异常而失败 引发的异常。

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

此外,如果 CancellationToken 任务实际开始之前 被取消,它根本不会开始。