Есть ли какие-либо преимущества для использования CancellationTokenSource над логическим полем volatile для передачи сигнала Task
?CancellationTokenSource vs. volatile boolean
ответ
Конечно, да. Здесь очень много. Я перечислил несколько.
CancellationToken
поддерживает обратные вызовы. Вы можете получать уведомления, когда запрашивается аннулирование.CancellationToken
поддерживаетWaitHandle
, что вы можете ждать бесконечно или с таймаутом.- Вы можете запланировать отмену
CancellationToken
с использованием методаCancellationTokenSource.CancelAfter
. - Вы можете связать свой номер
CancellationToken
с другим, так что, когда он отменяется, другой может считаться аннулированным. - К
Task
Если вы имеете в видуSystem.Threading.Tasks.Task
, то volatile boolean не может перевести состояние задачи на отмену, но можетCancellationToken
.
А также [вот интересная статья от Эрика Липперта] (http: // blogs .msdn.com/b/ericlippert/archive/2011/06/16/atomicity-volatility-and-immutability-are-different-part-three.aspx), объясняя, почему он думает, что вы не должны использовать 'volatile'. –
Это очень полно, спасибо. – Yoav
@ MatthewWatson: чтобы быть справедливым, главным возражением Эрика кажется, что часто очень сложно использовать 'volatile' правильно, и что' lock' обычно имеет достаточную производительность и семантически легче понять. Простой флаг «volatile», который сигнализирует о прекращении задачи, хотя и нежелателен по другим причинам, не тот, о чем Эрик, похоже, интересует в своей статье. –
«CancellationToken» не предназначен для того, чтобы сигнализировать о завершении потока, он предназначен для указания операции «Задача» на «отменить». Если вы хотите вернуть «Задачу», просто используйте оператор 'return'. –
Поскольку есть нагрузка стандартных классов Threading C# (включая Task), которые используют 'CancellationTokenSource' в своих интерфейсах, то это то, что вы должны использовать. –
@ YuvalItzchakov, если я не ошибаюсь, мне все равно нужно обрабатывать то, как заканчиваются мои задачи при использовании объекта CancelationTokeSource (т.е. возврат или перерыв). – Yoav