Василий Банников, Читал тут, что для Canceled нужно 3 условия.
1. Если бросаем саму ошибку, а не вызываем token.ThrowIfCancellationRequested, нужно в конструктор передать токен.
2. Передать в создающий метод(e.g. Task.Run) тот же токен
3. Чтобы у токена IsCancellationRequested было равно true
и на самом деле, если писать token.ThrowIfCancellationRequested, то без соблюдения остальных условий, будет Faulted. Однако если просто бросить ошибку, то будет Canceled.
token.ThrowIfCancellationRequested эквивалентен if(token.IsCancellationRequested) throw new OperationCanceledException(token) (написано в самих библиотеках .NET). Если так и написать, то всё работает, как и должно работать( то бишь Faulted, потому что я не соблюдаю другие 2 условия ). Но если убрать проверку if(token.IsCancellationRequested), которая в данном примере всегда будет истинна, то уже результат меняется и становится Canceled. В этом суть.
Василий Банников, Кстати, в первом варианте, даже если не посылать запрос на отмену операции( не передавать в конструктор CancellationTokenSource единицу) , всё равно будет Canceled.
Василий Банников, Можете, пожалуйста, всё равно объяснить, как оно работает конкретно в данном случае без изменений кода. Ответ ниже мне не понравился, потому что я специально использовал Thread.Sleep для блокировки потока, чтобы просто все таймеры успели отработать.
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.
1. Если бросаем саму ошибку, а не вызываем token.ThrowIfCancellationRequested, нужно в конструктор передать токен.
2. Передать в создающий метод(e.g. Task.Run) тот же токен
3. Чтобы у токена IsCancellationRequested было равно true
и на самом деле, если писать token.ThrowIfCancellationRequested, то без соблюдения остальных условий, будет Faulted. Однако если просто бросить ошибку, то будет Canceled.
token.ThrowIfCancellationRequested эквивалентен if(token.IsCancellationRequested) throw new OperationCanceledException(token) (написано в самих библиотеках .NET). Если так и написать, то всё работает, как и должно работать( то бишь Faulted, потому что я не соблюдаю другие 2 условия ). Но если убрать проверку if(token.IsCancellationRequested), которая в данном примере всегда будет истинна, то уже результат меняется и становится Canceled. В этом суть.