Некоторые System.Threading.Tasks.Task
конструкторы принимают CancellationToken
в качестве параметра:
CancellationTokenSource source = new CancellationTokenSource();
Task t = new Task (/* method */, source.Token);
Что меня сбивает с толку, так это то, что изнутри тела метода не существует способа фактически получить переданный токен (например, ничего подобного Task.CurrentTask.CancellationToken
). Токен должен быть предоставлен через какой-то другой механизм, такой как объект состояния, или захвачен в лямбду.
Итак, для чего служит предоставление токена отмены в конструкторе?
Parallel.For
илиParallel.ForEach
Конструктор использует токен для внутренней обработки отмены. Если ваш код хочет получить доступ к токену, вы несете ответственность за его передачу. Я очень рекомендую прочитать книгу « Параллельное программирование с Microsoft .NET» в CodePlex .
Пример использования CTS из книги:
источник
token.ThrowIfCancellationRequested();
? В моем тесте поведение такое же. Любые идеи?when cts.Cancel() is called the Task is going to get canceled and end, no matter what you do
. Если задание отменено до его запуска, оно отменяется . Если тело Задачи просто никогда не проверяет токен, оно будет выполнено до завершения, что приведет к состоянию RanToCompletion . Если тело выбрасываетOperationCancelledException
, например, byThrowIfCancellationRequested
, то Task проверяет, совпадает ли CancellationToken этого исключения с тем, который связан с Task. Если это так, задача отменяется . Если нет, то это вина .Отмена - не простой случай, как многие могут подумать. Некоторые из тонкостей объяснены в этом сообщении в блоге на MSDN:
Например:
Отмена в параллельных расширениях
источник
Вот пример , который демонстрирует две точки в ответ по Макс Галкин :
Вывод:
источник