为什么取消Task.Delay的速度很慢?

巴勃罗·霍尼(Pablo Honey)

我创建了一个测试程序,该程序运行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
亨克·霍尔特曼

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么加载此文件的速度很慢

为什么Scala程序的编译速度很慢?

为什么CPU仿真速度很慢

为什么Ubuntu的启动速度很慢?

为什么使用Dataflow EXTREMELY写入Bigquery的速度很慢?

为什么我到AFP共享的网络速度很慢?

为什么Mac上的名称解析速度很慢

为什么某些utorrent文件下载速度很慢?

为什么Impala扫描节点的速度很慢(RowBatchQueueGetWaitTime)?

PHP / MySQL速度很慢,不知道为什么?

为什么Chrome中的下载速度很慢,然后才使用?

为什么在Ubuntu 14.04上,Firefox的页面滚动速度很慢?

MySQL顺序插入速度很慢,而线程插入速度很快-为什么?

无法理解为什么ISP速度通过无线速度很慢

为什么通过扁平化迭代器进行迭代的速度很慢?

为什么我的页面加载速度很慢我在我的 html 中使用预加载的 js CDN

为什么对一个向量进行多线程操作的速度很慢?

为什么我的家用计算机上的bittorrent速度很慢?

为什么从相同分区上的现有文件设置Django FileField速度很慢?

为什么本地客户端的厨师-客户端同步速度很慢

为什么朱莉娅进行第一次评估的速度很慢?

创建新记录时,为什么我的Neo4J合并查询速度很慢?

Wifi速度很慢/无法在Mac上的linux上运行;为什么不连接?

MySQL对两个不同索引的查询速度很快,但是合并为一个查询的速度很慢。为什么?

为什么contextmanager很慢

为什么Task.Delay破坏线程的STA状态?

为什么第一次运行HttpClient的速度很慢,但是却要快得多?

Windows 10-窗口打开速度很慢,GUI绘制会因为繁琐的多任务处理而变慢-但是为什么?

Windows的Cygwin速度很慢/很慢