Mik*_*g36 2 c# resharper task-parallel-library 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();
}
Run Code Online (Sandbox Code Playgroud)
当我运行此测试时,测试通过,但是,当我调试此测试(使用Resharper测试运行器)时,测试失败.
我不认为这与Resharper有任何关系,我认为Resharper可能正在创造一些可能在.Net中暴露问题的条件.或者,也许我只是在做一些完全错误的事情... 任何见解?
等待时不要使用取消令牌Task.它导致Wait在任务状态设置之前抛出并继续执行断言.
这两件事是并行发生的,所以它实际上是一个竞争条件,它是否发生,因此你试图复制问题和调试时的正确行为的问题.