繁体   English   中英

在任务中调用CancellationTokenSource.Cancel()不会将Task.IsCanceled设置为true

[英]Calling CancellationTokenSource.Cancel() within a task does not set Task.IsCanceled to true

如果我叫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在设置任务状态之前抛出并移至断言。

这两件事是同时发生的,因此实际上这是是否要发生的竞赛条件,因此,您不得不尝试复制问题以及调试时的正确行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM