вообще то твой код не работает в дотнет8, при прямом копировании. ошибок не дает, но и ни чего не печатает.. поиграюсь.. а так то... смотри внимательно:
CancellationToken token = cancelTokenSource.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);
}
});
.. они у тебя в одной области видимости, и ты бодро проверяешь статус завершения.. зачем? ;)))
... решения?.. ну простейшее - CancellationTokenSource2 ... не быть же второй таске вечной..
ps
в 4,8 работает такusing System.Threading.Tasks;
using System.Threading;
using System;
class cancelTokenTest
{
static void Main(string[] args)
{
var cancelTokenSource = new CancellationTokenSource();
var token = cancelTokenSource.Token;
var cancelTokenSource2 = new CancellationTokenSource();
var token2 = cancelTokenSource2.Token;
var task = new Task(() =>
{
for (int i = 1; i < 100000; i++)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Операция 1 прервана");
return;
}
Console.WriteLine($"1. Квадрат числа {i} равен {i * i}");
Thread.Sleep(200);
}
}, token);
var task2 = new Task(() =>
{
for (int i = 10; i < 1000000; i++)
{
if (token2.IsCancellationRequested)
{
Console.WriteLine("Операция 2 прервана");
return;
}
Console.WriteLine($"2. Квадрат числа {i} равен {i * i}");
Thread.Sleep(200);
}
}, token2);
task.Start();
task2.Start();
Thread.Sleep(1000);
cancelTokenSource.Cancel();
Thread.Sleep(50); // без этого не успевает обновиться статус у меня..
Console.WriteLine($"Task Status 1: {task.Status}");
Thread.Sleep(1000);
cancelTokenSource2.Cancel();
Thread.Sleep(200); // можете закаментить для сравнения, и поиграть со значениями..
Console.WriteLine($"Task Status 2: {task2.Status}");
cancelTokenSource.Dispose();
cancelTokenSource2.Dispose();
}
}
в дотнет 8 ... не сразу... номожет устаревшие методы? но компилируются.. топят в пользу асинхронки?
... вот пример для 8
https://learn.microsoft.com/ru-ru/dotnet/api/syste...
обратите внимание на использование CancellationToken, он действительно обрывает исполнение до начала. можно конечно попытаться адаптировать под ваш случай.. но это если опять будет сильно не чего делать.. не отписывайтесь )))
using System.Runtime.CompilerServices;
public static class cancelTokenTest8and2task
{
public static void print(this string s) => Console.WriteLine(s);
public static void Main()
{
var ts1 = new CancellationTokenSource();
var tk1 = ts1.Token;
var ts2 = new CancellationTokenSource();
var tk2 = ts2.Token;
var t1 = new Task(() => {
for (int i = 1; i < 100000; i++)
{
if (tk1.IsCancellationRequested)
{
"Операция t1 прервана".print();
return;
}
$"t1. Квадрат числа {i} равен {i * i}".print();
Thread.Sleep(200);
}
});
var t2 = new Task(() => {
for (int i = 1; i < 100000; i++)
{
if (tk2.IsCancellationRequested)
{
"Операция t2 прервана".print();
return;
}
$"t2. Корень числа {i} равен {Math.Sqrt(i)}".print();
Thread.Sleep(200);
}
});
t1.Start();
t2.Start();
Thread.Sleep(1000);
ts1.Cancel();
Thread.Sleep(50);
$"\nTask1 status: {t1.Status}".print();
Thread.Sleep(1000);
ts2.Cancel();
Thread.Sleep(200);
$"\nTask2 status: {t2.Status}".print();
ts1.Dispose();
ts2.Dispose();
}
}
работает в дот нет 8 ... кроме
using System.Runtime.CompilerServices;
я разницы пока не вижу (имена не в счет!)...