OperationCanceledException和TaskCanceledException之间有什么区别?

107
在使用 .NET 4.5 中的 async/await 关键字时,OperationCanceledExceptionTaskCanceledException 有什么区别?我应该捕获哪一个?请用通俗易懂的语言解释。
1个回答

125

OperationCanceledException 简单来说是 TaskCanceledException 的基类,如果你捕获前者,那么后者同样也会被捕获。

在一些并发集合的操作中,仅抛出 OperationCanceledException,因为在公共 API 中实际上没有涉及任何实际的任务。例如,请参见 BlockingCollection.TryTake

我会捕获 OperationCanceledException,以防万一任务由于其自身抛出 OperationCanceledException 而被取消 - 你可能仍然希望将其视为 "只是取消"。


1
我从Stephen Toub的博客https://blogs.msdn.microsoft.com/pfxteam/2012/03/05/implementing-a-simple-foreachasync-part-2/中学习到了ForEachAsync方法。但是,如果我在 await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );中抛出一个异常,它会以某种方式被“更改”为TaskCanceledException,你有任何想法吗? 这对我来说是个问题,因为我想通过catch (OperationCanceledException)捕获一个真正的OperationCanceledException,但我不想捕获这个TaskCanceledException(它应该是ApplicationException)。 - Terry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接