【发布时间】:2012-10-13 23:23:11
【问题描述】:
OperationCanceledException 和 TaskCanceledException 有什么区别?如果我使用 .NET 4.5 并使用 async/await 关键字,我应该寻找哪一个?
【问题讨论】:
标签: c# exception asynchronous task
OperationCanceledException 和 TaskCanceledException 有什么区别?如果我使用 .NET 4.5 并使用 async/await 关键字,我应该寻找哪一个?
【问题讨论】:
标签: c# exception asynchronous task
OperationCanceledException 只是 TaskCanceledException 的基类 - 所以如果你抓住前者,你仍然会抓住后者。
并发集合上的一些操作只抛出 OperationCanceledException,因为没有涉及任何实际的任务(至少就公共 API 而言)。示例见BlockingCollection.TryTake。
我会抓住OperationCanceledException,以防万一任务由于本身刚刚抛出OperationCanceledException的操作而被取消-您可能仍想将其视为“只是取消”。
【讨论】:
await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } ); 中抛出异常,它会以某种方式“更改”为TaskCanceledException。知道那可能是什么吗?这对我来说是个问题,因为我想通过 catch ( OperationCanceledException ) 捕获一个“真正的” OperationCanceledException,但我不希望这个 TaskCanceledException (应该是 ApplicationException)被捕获。