【问题标题】:Self cancelling the task with OperationCanceledException使用 OperationCanceledException 自行取消任务
【发布时间】:2016-02-05 09:15:00
【问题描述】:

我注意到任务可以通过抛出OperationCanceledException 自行取消。通常,可以在OperationCanceledExceptionconstructor 中传递用户友好的原因,该原因后来成为异常消息。但是,在任务场景中看起来不是这样。该异常使任务被取消,但最终被翻译成TaskCanceledException,原始消息被替换为通用消息。

在这个例子中,有没有一种简洁的方式来说明取消原因?我查看了CancellationTokenSource,但也没有看到任何选项。

  class Program
  {
    static async Task MyAsyncMethod()
    {
      await Task.Delay(TimeSpan.FromSeconds(1));
      throw new OperationCanceledException("My lost cancellation reason");
    }


    static void Main(string[] args)
    {
      var task = MyAsyncMethod();
      try
      {
        task.Wait();
      }
      catch (AggregateException ecxeptions)
      {
        var exception = ecxeptions.InnerException;
        Console.WriteLine(exception.GetType());       //TaskCanceledException
        Console.WriteLine(exception.Message);         //A task was canceled.
        Console.WriteLine(task.Status);               //Canceled
        Console.WriteLine(task.Exception == null);    //true
      }

      Console.Read();
    }
  }

【问题讨论】:

    标签: c# async-await task cancellation


    【解决方案1】:

    这仅在您使用 Task.Wait 创建一个新的 AggregateException 来捆绑所有内部异常时发生。

    如果你使用await,实际的异常会被抛出并且会有正确的消息。由于您不能在Main 中使用await,您可以使用GetAwaiter().GetResult(),它将同步阻塞,但仍会产生与await 相同的异常(没有聚合):

    static async Task MyAsyncMethod()
    {
        await Task.Delay(TimeSpan.FromSeconds(1));
        throw new TaskCanceledException("My lost cancellation reason");
    }
    
    static void Main()
    {
        var task = MyAsyncMethod();
        try
        {
            task.GetAwaiter().GetResult();
        }
        catch (TaskCanceledException exception)
        {
            Console.WriteLine(exception.GetType()); // TaskCanceledException
            Console.WriteLine(exception.Message); // My lost cancellation reason
            Console.WriteLine(task.Status); // Canceled
            Console.WriteLine(task.Exception == null); // true
        }
    
        Console.Read();
    }
    

    【讨论】:

      猜你喜欢
      • 2016-03-25
      • 1970-01-01
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      相关资源
      最近更新 更多