gpt4 book ai didi

c# - 为什么取消 Task.Delay 很慢?

转载 作者:行者123 更新时间:2023-11-30 20:15:28 25 4
gpt4 key购买 nike

我创建了一个运行 1000 个任务的测试程序,这些任务执行 Task.Delay,随机延迟在 20 到 30 秒之间。看起来取消这个操作大约需要 10s..

这是我的测试程序:

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

最佳答案

当我用 F5 运行它时,我得到了类似的结果。
使用 Ctrl+F5(无调试器)运行它,它会在不到 50 毫秒的时间内取消。

因此,您实际上是在为调试器计时 1000 次执行。调试器也可能会干扰其他执行点。始终在 Release模式下运行基准测试,没有调试器。

关于c# - 为什么取消 Task.Delay 很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54308923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com