Задать вопрос
KinetonDev
@KinetonDev
Изучаю .NET!

Task.Run и CancellationToken. Как работает отмена в данном случае?

Здравствуйте. Почему в следующих двух случаях у задачи в итоге будет разный статус? С тем учётом, что
token.IsCancellationRequested = true. Почему меняется функциональность, если по факту там написан эквивалент if(true)?

1. Здесь Status = Canceled
CancellationTokenSource cts = new CancellationTokenSource(1);
            var token = cts.Token;
            var task = Task.Run(() =>
            {
                    Thread.Sleep(5);
                    // if(token.IsCancellationRequested)
                    throw new OperationCanceledException(token);
            });

            Thread.Sleep(50);
            Console.WriteLine(task.Status);


2. Здесь будет Faulted.
CancellationTokenSource cts = new CancellationTokenSource(1);
            var token = cts.Token;
            var task = Task.Run(() =>
            {
                Thread.Sleep(5); 
                if(token.IsCancellationRequested) // true
                    throw new OperationCanceledException(token);
            });

            Thread.Sleep(50);
            Console.WriteLine(task.Status);


UPD: Интересно, что в первом случае, даже если не передавать в конструктор CancellationTokenSource единицу, всё равно будет Status = Canceled.
  • Вопрос задан
  • 1049 просмотров
Подписаться 4 Простой 8 комментариев
Решения вопроса 1
KinetonDev
@KinetonDev Автор вопроса
Изучаю .NET!
Нашёл ответ тут.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы