【问题标题】:C#: How to catch cancellation exception in task.continuewithC#:如何在 task.continuewith 中捕获取消异常
【发布时间】:2016-11-12 21:26:16
【问题描述】:

我尝试了很多方法,但未能在 task.ContinueWith 中捕获取消异常。这里有什么问题吗:

 CancellationTokenSource tokenSource = new CancellationTokenSource();
 Task task = new Task( ()=> { Thread.Sleep(1000); Console.WriteLine("in task!"); }, tokenSource.Token);

 task.Start();
 tokenSource.Cancel();
 task.ContinueWith(t =>
 {
      if(t.IsCanceled)
      {
           AggregateException e = t.Exception; 
           if(e == null) // is true
                Console.WriteLine("Cancelled: ");
      }
 });

 Console.Read();

输出是:

取消:

这意味着取消异常被捕获但异常本身为空。我的问题是如何在这里获得取消例外?

谢谢

德里克

【问题讨论】:

  • 好吧,如果一个任务被取消了,那是因为你取消了它。如果任务出错,可能有任何原因,然后您需要异常才能获得线索。为什么取消任务时需要异常?顺便说一句,如果有任何异常,那么您只能期待 OperationCanceledException。保留例外没有任何意义;o)
  • 为什么不能只使用t.IsCanceled 测试?这似乎足够了。

标签: c# task continuewith


【解决方案1】:

取消CancellationToken时不会自动抛出取消异常,如果你自己不抛出异常,任务会被取消但不会抛出异常,这就是为什么task的Exception属性为null的原因。

为了引发异常,您应该在您的一项任务操作中使用ThrowIfCancellationRequested 方法。

更多信息here

【讨论】:

  • 并且也tokenSource.Token传递给Task ctor。
猜你喜欢
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
相关资源
最近更新 更多