อะไรคือความแตกต่างระหว่างOperationCanceledExceptionและTaskCanceledException? หากฉันใช้. NET 4.5 และใช้async/ awaitคีย์เวิร์ดฉันควรหาคำใดมาใช้?
อะไรคือความแตกต่างระหว่างOperationCanceledExceptionและTaskCanceledException? หากฉันใช้. NET 4.5 และใช้async/ awaitคีย์เวิร์ดฉันควรหาคำใดมาใช้?
คำตอบ:
OperationCanceledExceptionเป็นเพียงคลาสพื้นฐานสำหรับTaskCanceledException- ดังนั้นหากคุณจับอดีตได้คุณจะยังคงจับได้
การดำเนินการบางอย่างในคอลเลกชันที่ทำงานพร้อมกันOperationCanceledExceptionอาจทำให้เกิดความเสียหายได้เนื่องจากไม่มีงานจริงที่เกี่ยวข้อง (อย่างน้อยก็เท่าที่เกี่ยวข้องกับ API สาธารณะ) ดูBlockingCollection.TryTakeตัวอย่าง
ฉันจะจับได้OperationCanceledExceptionในกรณีที่งานถูกยกเลิกเนื่องจากการดำเนินการที่ตัวเองเพิ่งโยนไปOperationCanceledException- คุณอาจยังคงต้องการให้ถือว่าเป็น "เพียงแค่การยกเลิก"
await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );อย่างใดก็จะ 'เปลี่ยน' เป็น TaskCanceledException มีความคิดว่าจะเป็นอย่างไร? นี่เป็นปัญหาสำหรับฉันเนื่องจากฉันต้องการตรวจจับ OperationCanceledException ที่ 'จริง' ผ่านทาง catch (OperationCanceledException) แต่ฉันไม่ต้องการให้ TaskCanceledException นี้ (ซึ่งควรจะเป็น ApplicationException)