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

Ale*_*lex 6 .net c# task-parallel-library

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

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

i3a*_*non 8

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

提示Task.Run方法永远不会抛出TaskCanceledException(至少在当前实现中).与"动作参数为空"和"与cancelToken关联的CancellationTokenSource被处置"时不同ArgumentNullException并且ObjectDisposedException同步抛出.分别.

Task.Run然而返回一个Task可使用的被取消CancellationToken参数(更上消除在这里)和等待它与await task,task.Wait(),task.Result等会抛出一个TaskCanceledException(可能包裹在一个AggregateException)

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");
}
Run Code Online (Sandbox Code Playgroud)

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

  1. "常规"同步异常(例如ArgumentNullExceptionObjectDisposedException)
  2. "异步"异步异常,只能通过等待返回的任务抛出(例如TaskCanceledException)