根据documentation,当任务已取消时,Task.Run(Action, CancellationToken)会引发TaskCanceledException
Task.Run(Action, CancellationToken)何时确切地抛出TaskCanceledException?尚不清楚必须满足什么条件才能引发此异常。

最佳答案

似乎有些困惑(并且文档可能会引起误解)。

调用Task.Run方法将从不抛出TaskCanceledException(至少对于当前实现而言)。与ArgumentNullExceptionObjectDisposedException不同,后者在“操作参数为null”和“与cancelestToken关联的CancellationTokenSource被处置时”同步抛出。分别。

但是Task.Run返回的Task可以使用CancellationToken参数取消(更多关于here中的取消操作),然后用await tasktask.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");
}

如果文档有两节可能的异常(exception)情况,可能会更清楚:
  • “常规”同步异常(例如ArgumentNullExceptionObjectDisposedException)
  • “异步”异步异常,只能通过等待返回的任务(例如TaskCanceledException)来抛出
  • 关于c# - Task.Run(Action,CancellationToken)何时会引发TaskCanceledException?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27196451/

    10-13 01:55