CancellationToken для чего?

232
21 апреля 2018, 16:55

Объясните пожалуйста на пальцах, для чего эта штука CancellationToken существует и как ей пользоваться. Почему возник вопрос, подключил стороннюю библиотеку для работы с IMAP, там существует метод, который требует выше описанную штуку обязательным параметром, вот мануал.

Answer 1

CancellationToken передается как параметр и используется для оповещения кода о необходимости отмены операции. То есть вы создаете токен, передаете его в сторонний код, но если вам надо этот сторонний код оповестить, что вы хотите отменить операцию, вы для этого используете этот токен. Пример есть по первой ссылке в MSDN или вот ещё пример

Answer 2

В качестве дополнения к правильному ответу @tym32167:

В .NET принята кооперативная отмена операций. То есть, вы должны передать внутрь операции информацию о том, что вам более не нужен её результат, а уж операция должна позаботиться о том, чтобы правильно оборвать себя.

Сама по себе отмена токена не вызывает обрыв операции. Обычно операция просматривает время от времени в удобных для этого точках выполнения, не требуется ли от неё отмена, и корректно завершает работу в случае необходимости. (Корректное завершение работы чаще всего выглядит снаружи как выброс исключения наподобие OperationCanceledException.)

Оборвать операцию автоматически снаружи, без сотрудничества со стороны самой операции, довольно сложно. Дело в том, что при окончании работы операции ей, возможно, придётся подчистить за собой: удалить временные файлы, отмапить разделяемую память, исключить себя от списка текущих операций, закрыть открытые окна. Внешний код никак не может знать, что именно нужно операции для корректного завершения. Поэтому он и не пытается оборвать операцию.

Известное исключение из этого правила — ASP.NET, который иногда убивает потоки по собственной инициативе.

READ ALSO
UnityEngine.UI.VerticalLayoutGroup не располагает объекты по сетке

UnityEngine.UI.VerticalLayoutGroup не располагает объекты по сетке

Задача - расположить объекты по сеткеДля этого пробовал VerticalLayoutGroup, HorisontalLayoutGroup, GridLayoutGroup

224
Проблемы с использованием библиотеки MailKit

Проблемы с использованием библиотеки MailKit

Использую библиотеку MailKitВот код

233
Где я могу задать ключи для компиляции в Visual Studio?

Где я могу задать ключи для компиляции в Visual Studio?

Прочитал на хабре, что можно уменьшить время компиляции, за счет ключа параллельной компиляции /MPВ настройках не вижу таких пунктов

286
Проблема ObservableCollection<T> Deserialize

Проблема ObservableCollection<T> Deserialize

Не могу разобраться с проблемой десериализации колекции объектов

215