小编典典

任务构造函数中的取消标记:为什么?

all

某些System.Threading.Tasks.Task构造函数将 aCancellationToken作为参数:

CancellationTokenSource source = new CancellationTokenSource();
Task t = new Task (/* method */, source.Token);

让我感到困惑的是,无法从方法主体 内部
实际获取传入的令牌(例如,没有类似的Task.CurrentTask.CancellationToken)。令牌必须通过其他机制提供,例如状态对象或在
lambda 中捕获。

那么在构造函数中提供取消令牌的目的是什么?


阅读 71

收藏
2022-06-08

共1个答案

小编典典

将 a 传递给CancellationToken构造Task函数会将其与任务相关联。

从 MSDN引用Stephen Toub 的回答

这有两个主要好处:

  1. Task如果令牌在开始执行之前已请求取消,Task则不会执行。它不会过渡到
    Running,而是立即过渡到Canceled。如果它在运行时被取消,这可以避免运行任务的成本。
    2.
    如果任务的主体也在监视取消令牌并抛出一个OperationCanceledException包含该令牌(这是什么ThrowIfCancellationRequested),那么当任务看到
    OperationCanceledException,它会检查
    的令牌是否OperationCanceledException与任务的令牌匹配。如果是这样,则该异常被视为对合作取消和Task转换到Canceled
    状态(而不是Faulted状态)的确认。
2022-06-08