2012-10-23 6 views

Trả lời

75

OperationCanceledException chỉ đơn giản là lớp cơ sở cho TaskCanceledException - vì vậy nếu bạn nắm bắt trước đây, bạn vẫn sẽ bắt được sau.

Một số thao tác trên các bộ sưu tập đồng thời chỉ ném OperationCanceledException, vì không có bất kỳ thực tế tác vụ nào liên quan (ít nhất là đến mức API công khai được quan tâm). Xem BlockingCollection.TryTake để biết ví dụ.

Tôi chỉ bắt được OperationCanceledException trong trường hợp tác vụ bị hủy do một hoạt động mà chính nó đã ném OperationCanceledException - có thể bạn vẫn muốn coi đó là "chỉ hủy".

+1

Tôi đã đưa ra một ForEachAsync chủ yếu từ blog của Stephen Toub https://blogs.msdn.microsoft.com/pfxteam/2012/03/05/implementing-a-simple-foreachasync-part-2/. Sau đó, nếu tôi ném một ngoại lệ bên trong một 'await enumerable.ForEachAsync (async() => {ném new ApplicationException (" Test ");});' bằng cách nào đó nó được 'thay đổi' thành một TaskCanceledException. Bất kỳ ý tưởng làm thế nào mà có thể được? Đây là vấn đề đối với tôi khi tôi muốn nắm bắt một ActivityCanceledException 'true' thông qua catch (OperationCanceledException) nhưng tôi không muốn TaskCanceledException này (mà thực sự nên là ApplicationException) bị bắt. – Terry