在使用 .NET 4.5 中的
async
/await
关键字时,OperationCanceledException
和 TaskCanceledException
有什么区别?我应该捕获哪一个?请用通俗易懂的语言解释。async
/await
关键字时,OperationCanceledException
和 TaskCanceledException
有什么区别?我应该捕获哪一个?请用通俗易懂的语言解释。OperationCanceledException
简单来说是 TaskCanceledException
的基类,如果你捕获前者,那么后者同样也会被捕获。
在一些并发集合的操作中,仅抛出 OperationCanceledException
,因为在公共 API 中实际上没有涉及任何实际的任务。例如,请参见 BlockingCollection.TryTake
。
我会捕获 OperationCanceledException
,以防万一任务由于其自身抛出 OperationCanceledException
而被取消 - 你可能仍然希望将其视为 "只是取消"。
await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );
中抛出一个异常,它会以某种方式被“更改”为TaskCanceledException,你有任何想法吗? 这对我来说是个问题,因为我想通过catch (OperationCanceledException)捕获一个真正的OperationCanceledException,但我不想捕获这个TaskCanceledException(它应该是ApplicationException)。 - Terry