[英]When does Task.Run(Action, CancellationToken) throw TaskCanceledException?
根据文档 Task.Run(Action, CancellationToken)
在任务被取消时抛出TaskCanceledException
。
什么时候Task.Run(Action, CancellationToken)
确实抛出TaskCanceledException
? 目前尚不清楚抛出此异常必须满足哪些条件。
似乎有些混乱(文档可能会产生误导)。
引用Task.Run
方法永远不会抛出TaskCanceledException
(至少在当前实现中)。 与“动作参数为空”和“与cancelToken关联的CancellationTokenSource已被ObjectDisposedException
”时同步抛出的ArgumentNullException
和ObjectDisposedException
不同。 分别。
然而, Task.Run
返回一个可以使用CancellationToken
参数取消的Task
(更多关于此处的取消)并使用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
) TaskCanceledException
) 读取托管线程中的取消 :
只有请求对象才能发出取消请求, 每个监听器都负责注意请求并及时响应。
然后继续:
取消是合作的,不会强迫听众。 侦听器确定如何优雅地终止以响应取消请求。
您需要确保正在侦听CancellationToken.IsCancelledRequested
或抛出CancellationToken.ThrowIfCancelltionRequested
的异常。 您有责任取消并await
操作以遵守取消例外。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.