将 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.Run
和Taskfactory.StartNew
的目的是让任务区分被取消 CancellationToken.ThrowIfCancellationRequested
和 因任何其他异常而失败 引发的异常。
也就是说,如果在开始时传递的 CancellationToken
抛出,则任务的状态为 Cancelled
而任何其他异常(即使来自另一个 CancellationToken
)都会将其设置为 Faulted
.
此外,如果 CancellationToken
在 任务实际开始之前 被取消,它根本不会开始。
在下面的代码中,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.Run
和Taskfactory.StartNew
的目的是让任务区分被取消 CancellationToken.ThrowIfCancellationRequested
和 因任何其他异常而失败 引发的异常。
也就是说,如果在开始时传递的 CancellationToken
抛出,则任务的状态为 Cancelled
而任何其他异常(即使来自另一个 CancellationToken
)都会将其设置为 Faulted
.
此外,如果 CancellationToken
在 任务实际开始之前 被取消,它根本不会开始。