Есть ли какие-либо преимущества для использования CancellationTokenSource в логическом поле volatile для сигнализации Task
финиш?
CancellationTokenSource против volatile boolean
Ответы (1)
Конечно да. Есть много. Я перечислю несколько.
CancellationToken
поддерживает обратные вызовы. Вы можете быть уведомлены, когда отмена запрошена.CancellationToken
поддерживаетWaitHandle
, которые вы можете ждать бесконечно или с тайм-аутом.- Вы можете запланировать отмену
CancellationToken
методомCancellationTokenSource.CancelAfter
. - Вы можете связать свой
CancellationToken
с другим, чтобы при отмене одного другого можно было считать отмененным. - Под
Task
, если вы имеете в видуSystem.Threading.Tasks.Task
, изменчивое логическое значение не может перевести состояние Задачи в отмененное, ноCancellationToken
может.
person
Sriram Sakthivel
schedule
04.05.2015
А также вот интересная статья Эрика Липперта, объясняющая, почему он считает, что вам не следует использовать
volatile
.
- person Matthew Watson; 04.05.2015
Это очень исчерпывающе, спасибо.
- person Yoav; 04.05.2015
@MatthewWatson: честно говоря, основное возражение Эрика, по-видимому, заключается в том, что часто очень сложно правильно использовать
volatile
, и что lock
обычно имеет достаточную производительность и семантически его легче понять. Простой флаг volatile
, сигнализирующий о прекращении задачи, хотя и нежелательный по другим причинам, похоже, не то, чем интересуется Эрик в своей статье.
- person Peter Duniho; 04.05.2015
Ссылка Мэтью Уотсона устарела, я обновляю ссылку здесь Атомарность, волатильность и неизменность разные, часть третья
- person Louis Go; 11.03.2020
CancellationToken
не предназначен для того, чтобы сигнализировать потоку о завершении, он предназначен для того, чтобы указатьTask
отменить его операцию. Если вы хотите, чтобы возвращалосьTask
, просто используйте операторreturn
. - person Yuval Itzchakov   schedule 04.05.2015CancellationTokenSource
в своих интерфейсах, то это то, что вам следует использовать. - person Matthew Watson   schedule 04.05.2015CancellationToken
— это единственный способ перевестиTask
в состояниеCanceled
. возврат наbool
переведет его в состояниеCompleted
- person Yuval Itzchakov   schedule 04.05.2015throw TaskCanceledException
, что привело бы к этому, но это было бы немного странно, потому что исключение не содержало бы значимогоCancellationToken
. - person Matthew Watson   schedule 04.05.2015TaskCanceledException
недостаточно. Вам нужно передать токен отмены, и тот же токен должен быть передан при запуске задачи. В противном случае Task не запустится, а сработает. - person Sriram Sakthivel   schedule 04.05.2015