找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1800|回复: 12

C# Task.Delay() 和 Thread.Sleep() 区别

 火.. [复制链接]
  • 打卡等级:即来则安
  • 打卡总天数:29
  • 打卡月天数:1
  • 打卡总奖励:7791
  • 最近打卡:2025-12-13 17:25:16

2540

主题

1353

回帖

2万

积分

管理员

积分
21301
发表于 2021-8-3 19:37:26 | 显示全部楼层 |阅读模式
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() 使当前线程休眠给定时间。

using System;using System.Diagnostics;using System.Threading;using System.Threading.Tasks;
namespace ConsoleApp5{    class Program    {        static void Main(string[] args)
        {            Task delay = asyncTask();            syncCode();            delay.Wait();            Console.ReadLine();        }        static async Task asyncTask()        {            var sw = new Stopwatch();            sw.Start();            Console.WriteLine("async: Starting *");            Task delay = Task.Delay(5000);            Console.WriteLine("async: Running for {0} seconds **", sw.Elapsed.TotalSeconds);            await delay;            Console.WriteLine("async: Running for {0} seconds ***", sw.Elapsed.TotalSeconds);            Console.WriteLine("async: Done ****");        }        static void syncCode()        {            var sw = new Stopwatch();            sw.Start();            Console.WriteLine("sync: Starting *****");            Thread.Sleep(5000);            Console.WriteLine("sync: Running for {0} seconds ******", sw.Elapsed.TotalSeconds);            Console.WriteLine("sync: Done *******");        }    }}
运行结果:
我们可以看到这个代码的执行过程中遇到await后就会返回执行了,待await的代码执行完毕后才继续执行接下来的代码的!
----------------------------------------------------------
Use Thread.Sleep when you want to block the current thread. 要阻止当前线程时,请使用Thread.Sleep 。
Use Task.Delay when you want a logical delay without blocking the current thread. 如果需要逻辑延迟而不阻塞当前线程,请使用Task.Delay 。
Efficiency should not be a paramount concern with these methods. 对于这些方法,效率不应该是最重要的问题。 Their primary real-world use is as retry timers for I/O operations, which are on the order of seconds rather than milliseconds. 它们在现实世界中的主要用途是作为I / O操作的重试计时器,其数量级为秒而不是毫秒
Also, it is interesting to notice that Thread.Sleep is far more accurate, ms accuracy is not really a problem, while Task.Delay can take 15-30ms minimal. 另外,有趣的是, Thread.Sleep准确性要高得多,ms的准确性并不是真正的问题,而Task.Delay占用时间最少为15-30ms。 The overhead on both functions is minimal compared to the ms accuracy they have (use Stopwatch Class if you need something more accurate). 与它们具有的ms精度相比,这两个函数的开销是最小的(如果您需要更精确的信息,请使用Stopwatch Class)。 Thread.Sleep still ties up your Thread, Task.Delay release it to do other work while you wait. Thread.Sleep仍然占用您的线程, Task.Delay释放它以便在您等待时进行其他工作。

工控课堂 www.gkket.com

0

主题

104

回帖

365

积分

注册会员

积分
365
发表于 2021-8-3 20:28:35 | 显示全部楼层
无回帖,不论坛,这才是人道。
工控课堂 www.gkket.com

0

主题

96

回帖

284

积分

注册会员

积分
284
发表于 2021-8-6 05:38:19 | 显示全部楼层
强烈支持楼主ing……
工控课堂 www.gkket.com

0

主题

128

回帖

206

积分

注册会员

积分
206
发表于 2025-11-12 10:00:53 | 显示全部楼层
楼主太会说了,字字句句都在理
工控课堂 www.gkket.com

0

主题

76

回帖

116

积分

新手上路

积分
116
发表于 2025-11-12 11:34:34 | 显示全部楼层
求个链接 / 教程,楼主好人一生平安~
工控课堂 www.gkket.com

0

主题

419

回帖

2477

积分

高级会员

积分
2477
发表于 2025-11-13 16:08:28 | 显示全部楼层
学到了学到了,这波分享太实用啦!
工控课堂 www.gkket.com

0

主题

99

回帖

149

积分

新手上路

积分
149
发表于 2025-11-13 16:18:36 | 显示全部楼层
这逻辑绝了,分析得太到位了吧
工控课堂 www.gkket.com

0

主题

87

回帖

126

积分

新手上路

积分
126
发表于 2025-11-13 16:31:48 | 显示全部楼层
来凑个热闹,为楼主增加点人气!
工控课堂 www.gkket.com

0

主题

106

回帖

160

积分

新手上路

积分
160
发表于 2025-11-14 16:32:11 | 显示全部楼层
这波反向操作,我属实没想到!
工控课堂 www.gkket.com

0

主题

85

回帖

130

积分

新手上路

积分
130
发表于 2025-11-14 21:12:33 | 显示全部楼层
谁懂啊!真的被戳中笑点 / 泪点了
工控课堂 www.gkket.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|手机版|免责声明|本站介绍|工控课堂 ( 沪ICP备20008691号-1 )

GMT+8, 2025-12-22 16:56 , Processed in 0.111716 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表