2

如果我cancellationTokenSource.Cancel在与取消令牌关联的任务中调用,OperationCancelledException则会正确抛出 ,但是task.IsCanceled并不总是true像预期的那样更新并设置为 。

可以使用以下 nUnit 测试快速演示该问题:

var cancellationTokenSource = new CancellationTokenSource();
Task task = Task.Factory.StartNew(() =>
{                                
    cancellationTokenSource.Cancel();
    cancellationTokenSource.Token.ThrowIfCancellationRequested();                
}, 
cancellationTokenSource.Token);

try
{
    task.Wait(cancellationTokenSource.Token);                
}
catch (OperationCanceledException)
{
}

if (task.IsCanceled)
{
    Assert.Pass();
}
else
{
    Assert.Fail();
}

当我运行这个测试时,测试通过了,但是,当我调试这个测试(使用 Resharper 测试运行器)时,测试失败了。

我认为这与 Resharper 没有任何关系,我认为 Resharper 可能只是在创造一些可能暴露 .Net 中的问题的条件。或者,也许我只是在做一些完全错误的事情......有什么见解吗?

4

1 回答 1

6

等待时不要使用取消令牌Task。它导致Wait在设置任务状态之前抛出并继续断言。

这两件事是并行发生的,所以它实际上是一个关于它是否发生的竞争条件,因此你在调试时尝试复制问题和正确行为的问题。

于 2015-01-13T18:17:55.290 回答