Вот пример кода, который создает новую задачу, которая имитирует длительный процесс. В этой задаче нет ничего особенного и чисто фокусируется на функции отмены. Я использую токен отмены, чтобы отменить задачу, а код работает отлично для меня.
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;
}
};