2015-05-04 3 views
13

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

+1

«CancellationToken» не предназначен для того, чтобы сигнализировать о завершении потока, он предназначен для указания операции «Задача» на «отменить». Если вы хотите вернуть «Задачу», просто используйте оператор 'return'. –

+0

Поскольку есть нагрузка стандартных классов Threading C# (включая Task), которые используют 'CancellationTokenSource' в своих интерфейсах, то это то, что вы должны использовать. –

+0

@ YuvalItzchakov, если я не ошибаюсь, мне все равно нужно обрабатывать то, как заканчиваются мои задачи при использовании объекта CancelationTokeSource (т.е. возврат или перерыв). – Yoav

ответ

20

Конечно, да. Здесь очень много. Я перечислил несколько.

  • CancellationToken поддерживает обратные вызовы. Вы можете получать уведомления, когда запрашивается аннулирование.
  • CancellationToken поддерживает WaitHandle, что вы можете ждать бесконечно или с таймаутом.
  • Вы можете запланировать отмену CancellationToken с использованием метода CancellationTokenSource.CancelAfter.
  • Вы можете связать свой номер CancellationToken с другим, так что, когда он отменяется, другой может считаться аннулированным.
  • К Task Если вы имеете в виду System.Threading.Tasks.Task, то volatile boolean не может перевести состояние задачи на отмену, но может CancellationToken.
+0

А также [вот интересная статья от Эрика Липперта] (http: // blogs .msdn.com/b/ericlippert/archive/2011/06/16/atomicity-volatility-and-immutability-are-different-part-three.aspx), объясняя, почему он думает, что вы не должны использовать 'volatile'. –

+0

Это очень полно, спасибо. – Yoav

+6

@ MatthewWatson: чтобы быть справедливым, главным возражением Эрика кажется, что часто очень сложно использовать 'volatile' правильно, и что' lock' обычно имеет достаточную производительность и семантически легче понять. Простой флаг «volatile», который сигнализирует о прекращении задачи, хотя и нежелателен по другим причинам, не тот, о чем Эрик, похоже, интересует в своей статье. –