CancellationTokenSource

CancellationTokenSource

如果我在与取消令牌关联的任务中调用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中的问题。或者,也许我只是在做一些完全错误的事情...有什么见解?

最佳答案

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

这两件事是并行发生的,因此实际上这是关于是否发生的竞争条件,因此,您在调试时曾试图复制问题和正确行为的问题。

09-28 14:20