อะไรคือความแตกต่างระหว่าง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)