Sự khác biệt giữa OperationCanceledException và TaskCanceledException?


101

Sự khác biệt giữa OperationCanceledExceptionvà là TaskCanceledExceptiongì? Nếu tôi đang sử dụng .NET 4.5 và sử dụng async/ awaittừ khóa, tôi nên tìm cái nào để bắt?

Câu trả lời:


117

OperationCanceledExceptionchỉ đơ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.TryTakeví dụ.

Tôi sẽ nắm bắt được OperationCanceledExceptionchỉ 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ỏ".


1
Tôi đã đưa ra một ForEachAsync chủ yếu là từ blog Stephen Toub của blogs.msdn.microsoft.com/pfxteam/2012/03/05/... . Sau đó, nếu tôi ném một ngoại lệ vào bên trong 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.
Terry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.