即使令牌与抛出的OperationCanceledException不匹配,任务也会转换为已取消

时间:2016-04-19 12:12:22

标签: c# .net

根据微软拥有documentation,当任务观察到OperationCanceledException时,它将转换到已取消状态 - 但仅当CancellationToken与任务关联的那个匹配时,否则它应该像其他任何例外一样过渡到Faulted:

  

当任务实例观察到用户代码抛出的OperationCanceledException时,它会将异常的标记与其关联的标记(传递给创建Task的API的标记)进行比较。如果它们相同并且令牌的IsCancellationRequested属性返回true,则任务将其解释为确认取消并转换到已取消状态。如果您不使用Wait或WaitAll方法等待任务,则该任务只将其状态设置为Canceled。

     

...

     

如果令牌的IsCancellationRequested属性返回false或者异常令牌与Task的令牌不匹配,则OperationCanceledException被视为正常异常,导致Task转换为陷入困境的国家。另请注意,其他异常的存在也会导致Task转换到Faulted状态。您可以在Status属性中获取已完成任务的状态。

然而,这不是我在测试中看到的。如果我执行以下代码(其中WaitForCompletionStatus来自ParallelExtensionsExtras):

var ctsForTask = new CancellationTokenSource();
var ctsForExc = new CancellationTokenSource();

var task = Task.Run(() =>
{
    throw new OperationCanceledException(ctsForExc.Token);
}, ctsForTask.Token);

task.WaitForCompletionStatus();
Console.WriteLine("Status: " + task.Status);

并检查控制台,打印

Status: Canceled

我是否遗漏了某些内容,或者Microsoft文档在这一点上是否明显错误?

PS:事实上它似乎是双重错误:它还声称对令牌IsCancellationRequested属性执行了检查,但在我上面写的代码中,没有任何令牌被取消。

0 个答案:

没有答案