OperationCanceledException和TaskCanceledException之间的区别?


101

OperationCanceledException和之间有什么区别TaskCanceledException?如果我使用.NET 4.5并使用async/ await关键字,我应该寻找哪个?

Answers:


117

OperationCanceledException仅仅是它的基类TaskCanceledException-因此,如果您抓住了前者,您仍然会抓住后者。

并发集合上的某些操作仅抛出OperationCanceledException,因为不涉及任何实际任务(至少就公共API而言)。请参阅BlockingCollection.TryTake示例。

如果OperationCanceledException由于某个操作本身被抛出而导致该任务被取消,我可能会遇到这种情况OperationCanceledException-您可能仍希望将其视为“只是取消”。


1
我主要是从Stephen Toub的博客blogs.msdn.microsoft.com/pfxteam/2012/03/05/…想到了一个ForEachAsync 。然后,如果我以await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );某种方式将异常抛出,则将其“更改”为TaskCanceledException。知道怎么回事吗?这对我来说是个问题,因为我想通过catch(OperationCanceledException)捕获一个'true'OperationCanceledException,但是我不希望捕获到这个TaskCanceledException(它实际上应该是ApplicationException)。
特里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.