Каково использование передачи 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;
}
};
Ответы
Ответ 1
UPDATE:
Следующий вопрос msdn описывает причину:
Передача маркера в StartNew связывает токен с Задачей. Это имеет два основных преимущества:
-
Если токен отменяет запрашивается до запуска Задачи, Задача не будет выполнить. Вместо того, чтобы переходить к Running, это немедленно переход на отмененный. Это позволяет избежать затрат на выполнение задачи, если он просто будет отменен во время работы.
-
Если тело задача также контролирует токен отмены и бросает OperationCanceledException, содержащий этот токен (что и есть ThrowIfCancellationRequested
), то, когда задача видит, что OCE, он проверяет, совпадает ли токен OCE с токеном задачи. Если оно делает это исключение рассматриваемым как подтверждение сотрудничества аннулирование и переходы задачи в состояние отмены (скорее чем состояние Faulted).