Класс CancellationTokenSource
является одноразовым. Быстрый взгляд на Reflector доказывает использование KernelEvent
, (весьма вероятного) неуправляемого ресурса. Поскольку у CancellationTokenSource
нет финализатора, если мы его не уничтожим, GC не сделает этого.
С другой стороны, если вы посмотрите на образцы, перечисленные в статье " Отмена публикации MSDN" в управляемых потоках, только один фрагмент кода располагает маркером.
Каков правильный способ избавиться от него в коде?
- Вы не можете обернуть код, начинающий свою параллельную задачу,
using
если вы не дождались его. И имеет смысл отменять, только если вы не ждете. - Конечно, вы можете добавить
ContinueWith
on task с вызовомDispose
, но это путь? - Как насчет отменяемых запросов PLINQ, которые не синхронизируются, но просто что-то делать в конце? Пусть говорят.
.ForAll(x => Console.Write(x))
? - Возможно ли повторное использование? Может ли тот же токен использоваться для нескольких вызовов, а затем удалять его вместе с хост-компонентом, допустим, пользовательский интерфейс?
Поскольку у него нет похожего метода Reset
для очистки IsCancelRequested
и Token
я бы предположил, что он не может использоваться повторно, поэтому каждый раз, когда вы запускаете задачу (или запрос PLINQ), вы должны создать новую. Это правда? Если да, то мой вопрос заключается в том, что является правильной и рекомендуемой стратегией для решения Dispose
с Dispose
на многих экземплярах CancellationTokenSource
?