什么时候Task.Run(Action,CancellationToken)抛出TaskCanceledException?

时间:2014-11-28 22:02:31

标签: c# .net task-parallel-library

根据documentation Task.Run(Action, CancellationToken)在任务取消时抛出TaskCanceledException

Task.Run(Action, CancellationToken)究竟何时抛出TaskCanceledException?目前尚不清楚抛出此异常必须满足哪些条件。

2 个答案:

答案 0 :(得分:6)

似乎有些混乱(文档可能会产生误导)。

引用Task.Run方法永远不会抛出TaskCanceledException(至少在当前实现中)。与{< {1}}和ArgumentNullException不同,当" action参数为null"和"与cancellationToken相关联的CancellationTokenSource已被处理。"分别

ObjectDisposedException但是会​​返回Task.Run,可以使用Task参数取消{有关here取消的更多信息)并使用CancellationToken等待, await tasktask.Wait()等会抛出task.Result(可能包含在TaskCanceledException中)

AggregateException

如果文档有两部分可能的例外情况,可能会更清楚:

  1. &#34;定期&#34;同步例外(例如Task<int> task = null; try { task = Task.Run(() => 5, new CancellationToken(true)); } catch (TaskCanceledException) { Console.WriteLine("Unreachable code"); } try { int result = await task; } catch (TaskCanceledException) { Console.WriteLine("Awaiting a canceled task"); } ArgumentNullException
  2. &#34;异步&#34;异步异常,只能通过等待返回的任务(例如ObjectDisposedException
  3. 来抛出

答案 1 :(得分:0)

阅读Cancellation in Managed Thread

  

只有请求对象才能发出取消请求,每个监听器都有责任及时发现请求并对其做出响应。

然后继续:

  

取消合作,并且不会强制侦听。侦听器确定如何优雅地终止以响应取消请求。

您需要确保在CancellationToken.IsCancelledRequested上倾听,或者抛出CancellationToken.ThrowIfCancelltionRequested的异常。 你的负责取消和await观察取消例外的操作。