【发布时间】:2017-03-21 14:01:14
【问题描述】:
我习惯于在处理取消异步操作时能够执行异步模式:
public async Task InvokeAsync(CancellationToken cancellationToken)
{
using(cancellationToken.Register(handler.Stop))
{
try
{
await handler.HandleAsync();
}
catch(HandlerStoppedException ex)
{
cancellationToken.ThrowIfCancellationRequested();
throw;
}
}
}
该方法调用了一个异步组件,该组件公开了某种取消机制。取消令牌设置回调以在请求取消令牌信号时调用取消机制。
我可以在我的测试中调用这个方法来在超时内执行它的功能。
async Task TestInvoke()
{
using (var timeout = new CancellationTokenSource(TimeSpan.FromSeconds(10))
{
try
{
await InvokeAsync(timeout.Token);
}
catch (TaskCancelledException ex)
{
if (ex.CancellationToken == timeout.Token)
{
throw new TimeoutException(
"Operation failed to complete in the allowed time.", ex);
}
throw;
}
}
}
我的期望是在async 方法中抛出OperationCanceledException 将导致该方法返回的Task 转换为“已取消”状态。然后,我希望任何等待此已取消任务的尝试都应该抛出 TaskCanceledException。
在我当前的情况下(代码与上面非常相似),当我等待任务时,我得到了一个OperationCanceledException。如果我检查任务的状态,我可以看到它处于“已取消”状态并且没有与之关联的异常。
更奇怪的是,如果我在任务上调用Wait(),它会抛出一个包含预期TaskCanceledException 的AggregateException。
在什么情况下等待取消的任务会抛出OperationCanceledException而不是更典型的TaskCanceledException?
【问题讨论】:
-
stackoverflow.com/questions/26577519/… 这应该对你有帮助。
标签: c# async-await