繁体   English   中英

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

[英]When does Task.Run(Action, CancellationToken) throw TaskCanceledException?

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

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

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

引用Task.Run方法永远不会抛出TaskCanceledException (至少在当前实现中)。 与“动作参数为空”和“与cancelToken关联的CancellationTokenSource已被ObjectDisposedException ”时同步抛出的ArgumentNullExceptionObjectDisposedException不同。 分别。

然而, Task.Run返回一个可以使用CancellationToken参数取消的Task (更多关于此处的取消)并使用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");
}

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

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

读取托管线程中的取消

只有请求对象才能发出取消请求, 每个监听器都负责注意请求并及时响应。

然后继续:

取消是合作的,不会强迫听众。 侦听器确定如何优雅地终止以响应取消请求。

您需要确保正在侦听CancellationToken.IsCancelledRequested或抛出CancellationToken.ThrowIfCancelltionRequested的异常。 您有责任取消并await操作以遵守取消例外。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM