Подтвердить что ты не робот

Разница между 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

4b9b3361

Ответ 1

  • Использование CancellationToken позволяет токену обрабатывать всю необходимую синхронизацию, поэтому вам не нужно об этом думать.
  • Когда a Task ошибки из-за того, что токен, используемый при его создании, отмечен как отмененный, он отменяет состояние Task, а не сбой. Если вы используете логическое значение (и не бросаете), задача будет фактически отмечена как успешно завершенная, даже если она была фактически отменена.
  • В отличие от логического, это ссылочный тип, поэтому ссылка на CTS может быть передана и отменена (или проверена) из других мест. Это ключ к тому, что эти места не обязательно должны соединяться так, как если бы вы использовали логическое поле; ни код, определяющий, когда операция отменяется, ни какой-либо код, реагирующий на отмену, должны знать друг о друге. Это обеспечивает большую модульность, абстракцию, более высокий уровень функциональности, не свойственный конкретным обстоятельствам, и т.д.
  • Он добавляет расширенный смысловой смысл в код.