Різниця між OperationCanceledException та TaskCanceledException?


101

У чому різниця між OperationCanceledExceptionі TaskCanceledException? Якщо я використовую .NET 4.5 та використовую async/ awaitключові слова, які з них я хочу шукати?

Відповіді:


117

OperationCanceledExceptionпросто базовий клас для TaskCanceledException- тому якщо ви ловите перше, ви все одно будете ловити другий.

Деякі операції над одночасними колекціями є просто такими OperationCanceledException, оскільки ніяких реальних завдань не стосується (принаймні, що стосується публічного API). Див. BlockingCollection.TryTakeПриклад.

Я би спіймав про OperationCanceledExceptionвсяк випадок, якщо завдання скасується через операцію, яку само кинув OperationCanceledException- ви, мабуть, все ще хочете трактувати це як "просто скасування".


1
Я придумав ForEachAsync в основному з блогу Стівена Туба blogs.msdn.microsoft.com/pfxteam/2012/03/05/… . Тоді, якщо я кидаю виняток всередину await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );якось, він 'змінюється' на TaskCanceledException. Будь-яка ідея, як це могло бути? Це проблема для мене, оскільки я хочу зловити "справжню" OperationCanceledException через catch (OperationCanceledException), але я не хочу, щоб це TaskCanceledException (яке дійсно повинно бути ApplicationException) спіймане.
Террі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.