Task.IsCancelled不起作用

Rys*_*gan 2 c# task task-parallel-library

我有以下示例代码:

static class Program
{
    static void Main()
    {
        var cts = new CancellationTokenSource();

        var task = Task.Factory.StartNew(
            () =>
                {
                    try
                    {
                        Console.WriteLine("Task: Running");
                        Thread.Sleep(5000);
                        Console.WriteLine("Task: ThrowIfCancellationRequested");
                        cts.Token.ThrowIfCancellationRequested();
                        Thread.Sleep(2000);
                        Console.WriteLine("Task: Completed");
                    }
                    catch (Exception exception)
                    {
                        Console.WriteLine("Task: " + exception.GetType().Name);
                        throw;
                    }
                }).ContinueWith(t => Console.WriteLine("ContinueWith: cts.IsCancellationRequested = {0}, task.IsCanceled = {1}, task.Exception = {2}", cts.IsCancellationRequested, t.IsCanceled, t.Exception == null ? "null" : t.Exception.GetType().Name));

        Thread.Sleep(1000);

        Console.WriteLine("Main: Cancel");
        cts.Cancel();

        try
        {
            Console.WriteLine("Main: Wait");
            task.Wait();
        }
        catch (Exception exception)
        {
            Console.WriteLine("Main: Catch " + exception.GetType().Name);
        }

        Console.WriteLine("Main: task.IsCanceled = {0}", task.IsCanceled);
        Console.WriteLine("Press any key to exit...");

        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

  • 任务:跑步
  • 主要:取消
  • 主要:等等
  • 任务:ThrowIfCancellationRequested
  • 任务:OperationCanceledException
  • ContinueWith:cts.IsCancellationRequested = True,task.IsCanceled = False,task.Exception = AggregateException
  • Main:task.IsCanceled = False
  • 按任何一个键退出...

如果我删除ContinueWith,则输出为:

  • 任务:跑步
  • 主要:取消
  • 主要:等等
  • 任务:ThrowIfCancellationRequested
  • 任务:OperationCanceledException
  • Main:Catch AggregateException
  • Main:task.IsCanceled = False
  • 按任何一个键退出...

我不明白,为什么task.IsCanceled在两种情况下都返回false?

为什么只有没有ContinueWith才能重新抛出异常?


我想要实现的是一种等待任务完成的统一和简单的方法,以及一个指示任务是否被取消的属性.

ale*_*lex 6

我认为你不是取消任务本身,而只是从任务中抛出异常.尝试使用StartNew(Action action,CancellationToken cancellationToken)而不是StartNew(Action action).您还可以将取消标记添加为ContinueWith的参数.