某些System.Threading.Tasks.Task构造函数将 aCancellationToken作为参数:
System.Threading.Tasks.Task
CancellationToken
CancellationTokenSource source = new CancellationTokenSource(); Task t = new Task (/* method */, source.Token);
让我感到困惑的是,无法从方法主体 内部 实际获取传入的令牌(例如,没有类似的Task.CurrentTask.CancellationToken)。令牌必须通过其他机制提供,例如状态对象或在 lambda 中捕获。
Task.CurrentTask.CancellationToken
那么在构造函数中提供取消令牌的目的是什么?
将 a 传递给CancellationToken构造Task函数会将其与任务相关联。
Task
从 MSDN引用Stephen Toub 的回答:
这有两个主要好处: Task如果令牌在开始执行之前已请求取消,Task则不会执行。它不会过渡到 Running,而是立即过渡到Canceled。如果它在运行时被取消,这可以避免运行任务的成本。 2. 如果任务的主体也在监视取消令牌并抛出一个OperationCanceledException包含该令牌(这是什么ThrowIfCancellationRequested),那么当任务看到 时OperationCanceledException,它会检查 的令牌是否OperationCanceledException与任务的令牌匹配。如果是这样,则该异常被视为对合作取消和Task转换到Canceled 状态(而不是Faulted状态)的确认。
这有两个主要好处:
Running
Canceled
OperationCanceledException
ThrowIfCancellationRequested
Faulted