CancellationTokenSource против volatile boolean

Есть ли какие-либо преимущества для использования CancellationTokenSource в логическом поле volatile для сигнализации Task финиш?


person Yoav    schedule 04.05.2015    source источник
comment
CancellationToken не предназначен для того, чтобы сигнализировать потоку о завершении, он предназначен для того, чтобы указать Task отменить его операцию. Если вы хотите, чтобы возвращалось Task, просто используйте оператор return.   -  person Yuval Itzchakov    schedule 04.05.2015
comment
Поскольку существует множество стандартных классов многопоточности С# (включая Task), которые используют CancellationTokenSource в своих интерфейсах, то это то, что вам следует использовать.   -  person Matthew Watson    schedule 04.05.2015
comment
@YuvalItzchakov, если я не ошибаюсь, мне все еще нужно обрабатывать то, как завершаются мои задачи при использовании CancelationTokeSource (т.е. возврат или прерывание)   -  person Yoav    schedule 04.05.2015
comment
CancellationToken — это единственный способ перевести Task в состояние Canceled. возврат на bool переведет его в состояние Completed   -  person Yuval Itzchakov    schedule 04.05.2015
comment
@YuvalItzchakov Ну, вы могли бы throw TaskCanceledException, что привело бы к этому, но это было бы немного странно, потому что исключение не содержало бы значимого CancellationToken.   -  person Matthew Watson    schedule 04.05.2015
comment
@MatthewWatson В этом не было бы особого смысла, не так ли? :)   -  person Yuval Itzchakov    schedule 04.05.2015
comment
@MatthewWatson Просто бросить TaskCanceledException недостаточно. Вам нужно передать токен отмены, и тот же токен должен быть передан при запуске задачи. В противном случае Task не запустится, а сработает.   -  person Sriram Sakthivel    schedule 04.05.2015
comment
Возможно, дубликат Разница между CancellationTokenSource и флагом выхода для выхода из цикла задачи   -  person Peter Duniho    schedule 04.05.2015


Ответы (1)


Конечно да. Есть много. Я перечислю несколько.

  • CancellationToken поддерживает обратные вызовы. Вы можете быть уведомлены, когда отмена запрошена.
  • CancellationToken поддерживает WaitHandle, которые вы можете ждать бесконечно или с тайм-аутом.
  • Вы можете запланировать отмену CancellationToken методом CancellationTokenSource.CancelAfter.
  • Вы можете связать свой CancellationToken с другим, чтобы при отмене одного другого можно было считать отмененным.
  • Под Task, если вы имеете в виду System.Threading.Tasks.Task, изменчивое логическое значение не может перевести состояние Задачи в отмененное, но CancellationToken может.
person Sriram Sakthivel    schedule 04.05.2015
comment
А также вот интересная статья Эрика Липперта, объясняющая, почему он считает, что вам не следует использовать volatile. - person Matthew Watson; 04.05.2015
comment
Это очень исчерпывающе, спасибо. - person Yoav; 04.05.2015
comment
@MatthewWatson: честно говоря, основное возражение Эрика, по-видимому, заключается в том, что часто очень сложно правильно использовать volatile, и что lock обычно имеет достаточную производительность и семантически его легче понять. Простой флаг volatile, сигнализирующий о прекращении задачи, хотя и нежелательный по другим причинам, похоже, не то, чем интересуется Эрик в своей статье. - person Peter Duniho; 04.05.2015
comment
Ссылка Мэтью Уотсона устарела, я обновляю ссылку здесь Атомарность, волатильность и неизменность разные, часть третья - person Louis Go; 11.03.2020