Разница между CancellationTokenSource и флагом выхода для выхода цикла Task
Мне было интересно, есть ли разница между конечной задачей цикла с CancellationTokenSource и флажком выхода
CancellationTokenSource:
CancellationTokenSource cancellationTokenSource;
Task loopTask;
void StartLoop()
{
cancellationTokenSource = new CancellationTokenSource();
loopTask = Task.Factory.StartNew(Loop, TaskCreationOptions.LongRunning);
}
void Loop()
{
while (true)
{
if (cancellationTokenSource.IsCancellationRequested)
break;
Thread.Yield();
}
}
void StopLoop()
{
cancellationTokenSource.Cancel();
loopTask = null;
cancellationTokenSource = null;
}
Флаг выхода:
volatile bool exitLoop;
Task loopTask;
void StartLoop()
{
exitLoop = false;
loopTask = Task.Factory.StartNew(Loop, TaskCreationOptions.LongRunning);
}
void Loop()
{
while (true)
{
if (exitLoop)
break;
Thread.Yield();
}
}
void StopLoop()
{
exitLoop = true;
loopTask = null;
}
Для меня не имеет смысла использовать CancellationTokenSource, кстати, есть ли причина, по которой маркер отмены может быть добавлен в качестве параметра в задачу factory?
Большое спасибо за любой ответ.
Лучший игрок команды ragards
Ответы
Ответ 1
- Использование
CancellationToken
позволяет токену обрабатывать всю необходимую синхронизацию, поэтому вам не нужно об этом думать.
- Когда a
Task
ошибки из-за того, что токен, используемый при его создании, отмечен как отмененный, он отменяет состояние Task
, а не сбой. Если вы используете логическое значение (и не бросаете), задача будет фактически отмечена как успешно завершенная, даже если она была фактически отменена.
- В отличие от логического, это ссылочный тип, поэтому ссылка на CTS может быть передана и отменена (или проверена) из других мест. Это ключ к тому, что эти места не обязательно должны соединяться так, как если бы вы использовали логическое поле; ни код, определяющий, когда операция отменяется, ни какой-либо код, реагирующий на отмену, должны знать друг о друге. Это обеспечивает большую модульность, абстракцию, более высокий уровень функциональности, не свойственный конкретным обстоятельствам, и т.д.
- Он добавляет расширенный смысловой смысл в код.