Amir228
@Amir228

Есть ли смысл завершать задачи генерируя ошибку(token.ThrowIfCancellationRequested()) если есть спобос получше?

public enum WayCancelTask { None, Return, ThrowException }
        public static void DegreeOfTheNumbersWrite(int[] numbers, int degree, CancellationToken token, WayCancelTask wayCancel)
        {
            foreach (var num in numbers)
            {
                int result = num;

                for (int i = 1; i < degree; i++)
                    result *= num;

                Console.WriteLine($"Task id: { Task.CurrentId }, Result: { result }");

                if (token.IsCancellationRequested && wayCancel != WayCancelTask.None)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine($"\n\n Task canceled({ wayCancel }) \n\n");
                    Console.ForegroundColor = ConsoleColor.White;

                    if (wayCancel == WayCancelTask.Return)
                        return;
                    else if (wayCancel == WayCancelTask.ThrowException)
                        token.ThrowIfCancellationRequested();
                }

                Console.WriteLine("\n");
            }
        }

Зачем завершать задачу генерируя ошибку(token.ThrowIfCancellationRequested())? Вот есть способ завершать задачу return-ном в методе задачи. Это ведь не обязательно(так как раз кинул Cancel уже знаешь что задача завершиться), да и try-catch ресурса затратная конструкция. Так зачем вобще нужен такой способ завершение задачи?
  • Вопрос задан
  • 102 просмотра
Решения вопроса 2
@mvv-rus
Настоящий админ AD и ненастоящий программист
Во-первых, ваш заголовок вводит в заплуждение: в нем - про завершение процесса, а справшиваете вы про завешение задачи.
Во-вторых, задача может завершаться переходом в разные конечные состояния (они фиксируются в поле Task.Status). По оператору Return задача переходит в состояние RanToCompletion, по ThrowIfCancelationRequested - Canceled. Это - два логически разных состояния завершения (есть еще и третье - завершение по необработанному исключению, Faulted). Если коду, создаывшему задачу, совсем без разницы, как именно завершилась задача и вообще, завершилась ли она, то можете делать как угодно.
Но, очень часто код, связанной с задачей,к примеру, операция await для задачи, ведет себя по-разному, в зависимости от состояния завершения задачи, получение результата задачи - тоже. А для задачи продолжения можно задать условия, при каком состоянии завершения предыдущей задачи эта задача продолжения будет запущена. То есть, состояние завершения задачи обычно имеет значение.
Ответ написан
Комментировать
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Зачем завершать процесс генерируя ошибку(token.ThrowIfCancellationRequested())?

1. Чтобы не плодить постоянно Result классы с шаблонными Cancelled.
2. Как иначе определить успешно завершилась задача или токен был отменен?

Вот есть способ завершать задачу return-ном в методе задачи.

У тебя void, а если должен вернуть что-то? См. п. 2

try-catch ресурса затратная конструкция

Если это код который запускается 10000000... раз в мс, то да - затратная. А если это бизнес-логика, которая часто меняется, то нет - так быстрее вносить изменения - просто добавь еще один обработчик (не надо вносить кучу флагов)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы