在下面的代码中,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);
答案 0 :(得分:4)
StartNew
方法在胎面池中调度任务,但此时无需启动它,因为线程可能不可用。在等待启动期间,可能发生取消请求,之后线程池根本不会启动任务。任务开始后,你的工作是处理取消任务。
答案 1 :(得分:4)
实际上,传递给CancellationToken
和Task.Run
的{{1}}的目的是允许任务区分被取消由{{抛出的异常由于任何其他异常,1}}和失败。
也就是说,如果在开始时传递的Taskfactory.StartNew
抛出,则任务的状态为CancellationToken.ThrowIfCancellationRequested
,而任何其他异常(甚至来自另一个CancellationToken
)都会将其设置为Cancelled
此外,如果在任务实际启动之前取消了CancellationToken
,则根本不会启动它。