任务构造函数中的取消令牌:为什么?

某些
System.Threading.Tasks.Task
构造函数将
CancellationToken
作为参数:
CancellationTokenSource source = new CancellationTokenSource();
Task t = new Task (/* method */, source.Token);
令我感到困惑的是,方法体内无法实际获取传入的令牌(例如,没有像
Task.CurrentTask.CancellationToken
)。必须通过某种其他机制提供令牌,例如状态对象或在lambda中捕获。 那么在构造函数中提供取消令牌的目的是什么呢?     
已邀请:
将此标记传递给Task构造函数会将其与此任务相关联。 引用Stephen Toub在MSDN上的回答:   这有两个主要好处:         如果令牌在任务开始执行之前已请求取消,则任务将不会执行。而不是过渡到   正在运行,它会立即转换为已取消。这避免了   如果在运行时只是取消任务,则运行任务的成本   无论如何。   如果任务的主体也在监视取消令牌并抛出包含该令牌的
OperationCanceledException
  (这是ThrowIfCancellationRequested所做的),然后当任务   看到OCE,它检查OCE的令牌是否与任务的匹配   令牌。如果是,则该异常被视为对此的确认   合作取消和任务过渡到已取消   国家(而不是Faulted州)。        
构造函数在内部使用令牌进行取消处理。如果您的代码想要访问令牌,则您有责任将其传递给自己。我强烈建议您阅读CodePlex上的Microsoft .NET并行编程书籍。 本书中CTS的使用示例:
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

Task myTask = Task.Factory.StartNew(() =>
{
    for (...)
    {
        token.ThrowIfCancellationRequested();

        // Body of for loop.
    }
}, token);

// ... elsewhere ...
cts.Cancel();
    
取消并不像许多人想象的那么简单。 msdn上的这篇博文中解释了一些细微之处: 例如:   在Parallel Extensions和其他系统中的某些情况下,它   因为未到期的原因而唤醒被阻止的方法是必要的   明确取消用户。例如,如果一个线程是   由于集合为空,阻塞在blockingCollection.Take()上   然后另一个线程调用   blockingCollection.CompleteAdding(),然后第一次调用应该唤醒   up并抛出InvalidOperationException来表示不正确的   用法。 http://blogs.msdn.com/b/pfxteam/archive/2009/06/22/9791840.aspx     

要回复问题请先登录注册