为什么一个Task可以关联一个CancellationToken?

Why can a Task be associated with a CancellationToken?

有人可以解释为什么可以使用 CancellationToken 实例化任务吗?

明确地说,我在这里不是在谈论什么是 CancellationToken 以及它的用途,我的问题实际上是 «Task 使用可选提供的 CancellationToken 做什么?

var cts = new CancellationTokenSource();

Task.Run(() =>
{
    while (true)
    {
    }
}, cts.Token);

cts.Cancel(); // This cancel will never cancel anything, so what can a task do with a CancellationToken?

Task.Run 的特定重载的文档明确而明确地指出:

A cancellation token that can be used to cancel the work if it has not yet started. Run(Action, CancellationToken) does not pass cancellationToken to action.

任务不是“创建”或“关联”取消令牌。

所以它只是用作早点。如果您给 Task.Run 一个已经取消的令牌,则不会安排任何内容,并且会返回一个已经取消的任务。同样,如果它在任务准备就绪时被取消 运行,生成的任务将被取消。

.NET 中的取消始终是合作的,而不是抢先的:任务的功能负责在开始后检查令牌本身。