当我创建一个任务然后取消它时,它的状态显示已取消,但将它与TaskStatus.Canceled进行比较会返回false

时间:2015-03-26 15:41:47

标签: c# task

我不明白为什么,当task.Status =取消时取消是假的

        var cancellation = new CancellationTokenSource();
        task = Task.Run(() => GetValueToPrint(), cancellation.Token);
        cancellation.Cancel();

        bool iscancelled = task.Status == TaskStatus.Canceled;

有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:1)

如果满足以下两个条件之一,

task.Status将仅等于Canceled

  1. 取消令牌在Task.Run来电之前已处于取消状态。
  2. Task.Run内运行的代码抛出了一个OperationCanceledException,并且传递给异常构造函数的令牌是相同的令牌(或linked token相同的令牌传递给Task.Run
  3. 的令牌)

    您没有上述任何一种情况,因此您的任务可能在检查时处于RunningRanToCompletion状态。

    如果您希望能够在启动后取消GetValueToPrint(),则必须将相同的令牌作为参数传递给它,然后在整个方法中,您需要在传入的方法上调用token.ThrowIfCancellationRequested()在可能取消的地方的令牌。这样做会使你在我上面列出的两个选项中属于#2。

    private string GetValueToPrint(CancellationToken token)
    {
       for(int i = 0; i < 10; i++)
       {
           Console.WriteLine("Loop");
           token.ThrowIfCancellationRequested()
           Thread.Sleep(1000);
       }
       return "42";
    }
    
    private void Example()
    {
        var cancellation = new CancellationTokenSource();
        task = Task.Run(() => GetValueToPrint(cancellation.Token), cancellation.Token);
        Thread.Sleep(5000);
        cancellation.Cancel();
    
        bool iscancelled = task.Status == TaskStatus.Canceled;
        Console.WriteLine(iscancelled);
    }
    

    你会看到“循环”打印4-6次(它有点竞争​​条件)然后iscancelled将是真的;