ความแตกต่างระหว่าง OperationCanceledException และ TaskCanceledException?


101

อะไรคือความแตกต่างระหว่างOperationCanceledExceptionและTaskCanceledException? หากฉันใช้. NET 4.5 และใช้async/ awaitคีย์เวิร์ดฉันควรหาคำใดมาใช้?

คำตอบ:


117

OperationCanceledExceptionเป็นเพียงคลาสพื้นฐานสำหรับTaskCanceledException- ดังนั้นหากคุณจับอดีตได้คุณจะยังคงจับได้

การดำเนินการบางอย่างในคอลเลกชันที่ทำงานพร้อมกันOperationCanceledExceptionอาจทำให้เกิดความเสียหายได้เนื่องจากไม่มีงานจริงที่เกี่ยวข้อง (อย่างน้อยก็เท่าที่เกี่ยวข้องกับ API สาธารณะ) ดูBlockingCollection.TryTakeตัวอย่าง

ฉันจะจับได้OperationCanceledExceptionในกรณีที่งานถูกยกเลิกเนื่องจากการดำเนินการที่ตัวเองเพิ่งโยนไปOperationCanceledException- คุณอาจยังคงต้องการให้ถือว่าเป็น "เพียงแค่การยกเลิก"


1
ฉันมากับ ForEachAsync ส่วนใหญ่มาจากสตีเฟ่น Toub บล็อกblogs.msdn.microsoft.com/pfxteam/2012/03/05/... จากนั้นถ้าฉันโยนข้อยกเว้นภายในawait enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );อย่างใดก็จะ 'เปลี่ยน' เป็น TaskCanceledException มีความคิดว่าจะเป็นอย่างไร? นี่เป็นปัญหาสำหรับฉันเนื่องจากฉันต้องการตรวจจับ OperationCanceledException ที่ 'จริง' ผ่านทาง catch (OperationCanceledException) แต่ฉันไม่ต้องการให้ TaskCanceledException นี้ (ซึ่งควรจะเป็น ApplicationException)
Terry
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.