zoukankan      html  css  js  c++  java
  • Task.Delay() 和 Thread.Sleep() 区别

    前言

    这篇已经做了一个总结,我来

    https://www.cnblogs.com/yy1234/p/8073732.html

    1、Thread.Sleep 是同步延迟,Task.Delay异步延迟。

    2、Thread.Sleep 会阻塞线程,Task.Delay不会。

    3、Thread.Sleep不能取消,Task.Delay可以。

    4、Task.Delay() 比 Thread.Sleep() 消耗更多的资源,但是Task.Delay()可用于为方法返回Task类型;或者根据CancellationToken取消标记动态取消等待

    5、Task.Delay() 实质创建一个运行给定时间的任务, Thread.Sleep() 使当前线程休眠给定时间。

    那么就用代码来验证一下吧。

    正文

    代码如下:

    static void Main(string[] args)
    {
    	var test = Test_Delay();
    	Thread.Sleep(TimeSpan.FromSeconds(2));
    	Stopwatch sw = new Stopwatch();
    	sw.Start();
    	test.Wait();
    	sw.Stop();
    	TimeSpan ts = sw.Elapsed;
    	Console.WriteLine(ts.TotalMilliseconds);
    	Console.ReadKey();
    }
    public static Task Test_Delay()
    {
    	Task delay1 = Task.Delay(TimeSpan.FromSeconds(5));
    	return delay1;
    }
    

    结果是:

    上面显示大概监听为3秒。这个表示了当前主线程在运行的时候,Task.Delay也在运行,这个只有在不同线程才可以实现。

    然后呢,不同线程自然不会堵塞。

    关于开销的问题,那么用vs 左边的性能测试测试一下。以前测过,代码丢了。思路就是让他们共同执行1000次,看下性能曲线。

    因为Task.Delay 多开一个线程所以消耗更多,然而实际使用中一般用Task.Delay,因为高并发不希望线程堵塞,而且Task.Delay 可以取消。

  • 相关阅读:
    Httprunner生成Allure格式HTML报告
    Go语言编写单元测试用例
    dotnet 在 UOS 国产系统上安装 dotnet sdk 的方法
    dotnet 在国产 UOS 系统利用 dotnet tool 工具做文件传输
    webpack丑化插件
    webpack自动生成html
    webpack vue
    webpack vue
    HO引擎近况20210225
    常用十大算法(三)— 动态规划算法
  • 原文地址:https://www.cnblogs.com/aoximin/p/13214402.html
Copyright © 2011-2022 走看看