Я создал тестовую программу, которая запускает 1000 задач, которые выполняют Task.Delay
со случайной задержкой от 20 до 30 секунд.
Похоже, что отмена этой операции занимает около 10 секунд ..
Вот моя тестовая программа:
class Program
{
static async Task MainAsync()
{
CancellationTokenSource tokenSource = new CancellationTokenSource();
List<Task> allTask = new List<Task>();
Random r = new Random(9);
async Task SafeDelay(int delay, CancellationToken token)
{
try
{
await Task.Delay(delay, token);
}
catch (TaskCanceledException)
{
}
}
for (int i = 0; i < 1000; i++)
{
var randomDelay = r.Next(20000, 30000);
allTask.Add(SafeDelay(randomDelay, tokenSource.Token));
;
}
Stopwatch stopwatch = new Stopwatch();
var cancelTask = Task.Delay(1000).ContinueWith(t =>
{
Console.Out.WriteLine("1000ms elapsed. Cancelation request start");;
stopwatch.Start();
tokenSource.Cancel();
});
await Task.WhenAll(allTask);
await cancelTask;
stopwatch.Stop();
Console.WriteLine($"Cancelation done after {stopwatch.ElapsedMilliseconds} ms");
}
static void Main(string[] args)
{
Console.WriteLine("Started");
Task.Run(MainAsync).GetAwaiter().GetResult();
Console.WriteLine("End");
Console.ReadLine();
}
}
Мой результат с .NET Core 2.1:
Cancelation done after 9808ms
Почему отмена Task.Delay такая медленная и есть ли способ ее улучшить?
Мой результат с .NET 4.7.1:
Cancelation done after 6200ms