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

Каково использование передачи CancellationToken для конструктора класса задач?

Вот пример кода, который создает новую задачу, которая имитирует длительный процесс. В этой задаче нет ничего особенного и чисто фокусируется на функции отмены. Я использую токен отмены, чтобы отменить задачу, а код работает отлично для меня.

       CancellationTokenSource CTS= new CancellationTokenSource();

       Task<Boolean> PTask = new Task<Boolean>(() => 
       {
           while (true)
           {
               if (!CTS.Token.IsCancellationRequested)
               {
                  Thread.Sleep(5000);
               }
               else{Console.WriteLine("Thread Cancelled");break;}
           }
           return true;

       }, CTS.Token, TaskCreationOptions.None);

       PTask.Start();
       Console.WriteLine("Hit Enter to cancel the Secondary thread you have started");
       Console.ReadLine();
       CTS.Cancel();
       System.Console.WriteLine(PTask.Result);

    }
}

Но то, что я не мог понять, это параметр токена (CTS.Token), который передается в Task Constructor. Каково фактическое использование передачи параметра, когда я могу фактически отменить задачу, даже не пропуская токена к конструктору.

Ниже приведена слегка измененная версия, которая работает без параметра токена.

      CancellationTokenSource CTS= new CancellationTokenSource();
      Task<Boolean> PTask = new Task<Boolean>(() => 
       {
           while (true)
           {
               if (!CTS.Token.IsCancellationRequested)
               {
                   Thread.Sleep(5000);
               }
               else
               {
                   Console.WriteLine("Thread Cancelled");
                   break;
               }
       };
4b9b3361

Ответ 1

UPDATE: Следующий вопрос msdn описывает причину:

Передача маркера в StartNew связывает токен с Задачей. Это имеет два основных преимущества:

  • Если токен отменяет запрашивается до запуска Задачи, Задача не будет выполнить. Вместо того, чтобы переходить к Running, это немедленно переход на отмененный. Это позволяет избежать затрат на выполнение задачи, если он просто будет отменен во время работы.

  • Если тело задача также контролирует токен отмены и бросает OperationCanceledException, содержащий этот токен (что и есть ThrowIfCancellationRequested), то, когда задача видит, что OCE, он проверяет, совпадает ли токен OCE с токеном задачи. Если оно делает это исключение рассматриваемым как подтверждение сотрудничества аннулирование и переходы задачи в состояние отмены (скорее чем состояние Faulted).