Фрагмент кода в Main():
static void Main(string[] args)
{
CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
CancellationToken token = cancelTokenSource.Token;
Task task = new Task(() =>
{
for (int i = 1; i < 10; i++)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Операция прервана");
return;
}
Console.WriteLine($"1. Квадрат числа {i} равен {i * i}");
Thread.Sleep(200);
}
}, token);
Task task2 = new Task(() =>
{
for (int i = 1; i < 10; i++)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Операция прервана");
return;
}
Console.WriteLine($"2. Квадрат числа {i} равен {i * i}");
Thread.Sleep(200);
}
});
task.Start();
task2.Start();
Thread.Sleep(1000);
cancelTokenSource.Cancel();
Thread.Sleep(1000);
Console.WriteLine($"Task Status: {task.Status}");
Console.WriteLine($"Task Status: {task2.Status}");
cancelTokenSource.Dispose();
}
Передаю токен в параметры конструктора первого объекта класса Task, но не передаю второму объекту. ПРи этом, на сколько я понимаю логику работы CancellationTokenSource и его использования (могу ошибаться), те таски, которым мы передаём токен, и могут как раз быть отменены конкретно через этот токен. То есть если у мя есть token и таски Task1, Task2, Task3, и я передаю его в параметры конструкторов Task1 и Task3, то и отменить с помощью метода Cancel() я могу только задачи Task1 и Task3, по идее.
Консольный вывод:
2. Квадрат числа 1 равен 1
1. Квадрат числа 1 равен 1
1. Квадрат числа 2 равен 4
2. Квадрат числа 2 равен 4
1. Квадрат числа 3 равен 9
2. Квадрат числа 3 равен 9
2. Квадрат числа 4 равен 16
1. Квадрат числа 4 равен 16
1. Квадрат числа 5 равен 25
2. Квадрат числа 5 равен 25
Операция прервана
Операция прервана
Task Status: RanToCompletion
Task Status: RanToCompletion
Я не понимаю, почему токен будто передаётся и объекту Task2, хотя такого по факту не происходит. Пожалуйста, кто знает, что тут происходит, объясните, почему такой консольный вывод и почему таска№2 тоже останавливается. Заранее благодарю!