У меня есть некоторые проблемы с пониманием задач и токенов отмены. Я сделал программу, которая выглядит так:
static void Main(string[] args)
{
CancellationTokenSource token = new CancellationTokenSource();
Stopwatch stop = new Stopwatch();
stop.Start();
for (int i = 0; i < 5; i++)
{
//Thread.Sleep(1000);
Task.Factory.StartNew(() => myLongTask(token.Token, (i + 1) * 1000));
}
while (true)
{
Thread.SpinWait(1000);
if (stop.ElapsedMilliseconds > 3000)
{
token.Cancel();
}
}
}
public static void myLongTask(CancellationToken token, int time)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Cancelled");
return;
}
var sw = Stopwatch.StartNew();
Console.WriteLine($"Task {time / 1000} started");
while (sw.ElapsedMilliseconds < time)
Thread.SpinWait(1000);
Console.WriteLine($"Task {time / 1000} ended");
}
Я запускаю 5 задач одновременно (хотя, когда я не включаю Thread.Sleep()
, кажется, что цикл for
запускается еще до запуска задач?). Ни одна из задач не отменяется, когда я запускаю программу. Также меня беспокоит... какую задачу я действительно отменяю при вызове token.Cancel()
? Как я могу выбрать, какую из 5 задач я буду убивать? Я могу определить каждую задачу по ее переменной, но я не могу получить доступ к ее свойству CancellationRequested
, так как она запускается с помощью CancellationToken
. Нужны ли мне тогда 5 разных токенов?