Câu trả lời:
OperationCanceledException
chỉ đơn giản là lớp cơ sở TaskCanceledException
- vì vậy nếu bạn bắt được cái trước, bạn vẫn sẽ bắt được cái sau.
Một số hoạt động trên các bộ sưu tập đồng thời chỉ ném ra OperationCanceledException
, vì không có bất kỳ tác vụ thực tế nào liên quan (ít nhất là đối với API công khai có liên quan). Xem BlockingCollection.TryTake
ví dụ.
Tôi sẽ nắm bắt được OperationCanceledException
chỉ trong trường hợp nhiệm vụ bị hủy bỏ do một hoạt động mà chính nó vừa thực hiện OperationCanceledException
- bạn có thể vẫn muốn coi đó là "chỉ cần hủy bỏ".
await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );
bằng cách nào đó thì nó được 'thay đổi' thành TaskCanceledException. Bất kỳ ý tưởng làm thế nào đó có thể là? Đây là vấn đề đối với tôi vì tôi muốn bắt một OperationCanceledException 'thực sự' thông qua bắt (OperationCanceledException) nhưng tôi không muốn TaskCanceledException này (thực sự phải là ApplicationException) bị bắt.