根据documentation Task.Run(Action, CancellationToken)
在任务取消时抛出TaskCanceledException
。
Task.Run(Action, CancellationToken)
究竟何时抛出TaskCanceledException
?目前尚不清楚抛出此异常必须满足哪些条件。
答案 0 :(得分:6)
似乎有些混乱(文档可能会产生误导)。
引用Task.Run
方法永远不会抛出TaskCanceledException
(至少在当前实现中)。与{< {1}}和ArgumentNullException
不同,当" action参数为null"和"与cancellationToken相关联的CancellationTokenSource已被处理。"分别
ObjectDisposedException
但是会返回Task.Run
,可以使用Task
参数取消{有关here取消的更多信息)并使用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");
}
和ArgumentNullException
)ObjectDisposedException
)答案 1 :(得分:0)
阅读Cancellation in Managed Thread:
只有请求对象才能发出取消请求,每个监听器都有责任及时发现请求并对其做出响应。
然后继续:
取消合作,并且不会强制侦听。侦听器确定如何优雅地终止以响应取消请求。
您需要确保在CancellationToken.IsCancelledRequested
上倾听,或者抛出CancellationToken.ThrowIfCancelltionRequested
的异常。 你的负责取消和await
观察取消例外的操作。