C# Thread.Sleep(0)有什么用?

本文详细解释了Windows10中线程睡眠函数Thread.Sleep(0),Thread.Yield以及Thread.Sleep(1)的区别,强调了在不同场景下使用它们的效率和用途,尤其是在图形界面、多线程爬虫和线程调度中的应用。还讨论了使用Timer进行高速定时器时的精度问题及其解决方案。

一、理论分析

回答这个要先从线程时间精度(时间片)开始说起。很多参考书说,默认情况下,时间片为15ms 左右,但是这是已经过时的知识。在老的 Windows 操作系统里,应用程序模式时时间片 15ms 左右,准确一点是15.625 左右。服务器模式是其双倍。但是在微软推行.Net 普及 Task之后,规则已经改动,并且做了精细的调节。现在Win10的时间精度为1ms(不用担心谷歌浏览器修改时间精度了),Win2013服务器的时间精度为7ms,使用微软提供的测试工具可以测出来:ClockRes - Sysinternals | Microsoft Learn

命令行:powercfg /energy

我们可以通过它可以更直观的看出:

因为有这个请求在,所以无论如何最低的计时器分辨率都只能为1ms。

所以,现在Win10 默认状态下,Sleep(1) 占时不再是15ms,而是1ms 左右:

### `Thread.Sleep` 与 `Task.Delay` 的区别 在 C# 中,`Thread.Sleep` 和 `Task.Delay` 都可以实现延迟操作,但它们在行为、适用场景以及对线程的影响方面存在显著差异。 #### 同步阻塞 vs 异步等待 `Thread.Sleep` 是一种同步阻塞方法,它会阻塞当前线程的执行,直到指定的时间过去。这意味着在此期间,该线程无法执行其他任务。例如,在 UI 线程中调用 `Thread.Sleep` 可能会导致界面冻结,影响用户体验[^2]。 ```csharp for (int i = 0; i < 5; i++) { Thread.Sleep(1000); Console.WriteLine("主线程在做其他任务..."); } ``` 相比之下,`Task.Delay` 是一个异步非阻塞方法,它不会阻塞线程,而是返回一个将在指定时间后完成的 `Task` 对象。通过 `await` 关键字可以实现对该延迟任务的等待,而不会阻塞当前线程。这使得 `Task.Delay` 更适合用于异步编程模型,尤其是在 UI 应用或需要保持线程响应能力的场景中[^1]。 ```csharp for (int i = 0; i < 5; i++) { await Task.Delay(1000); Console.WriteLine("这个任务在做任务..."); } ``` #### 线程池资源利用 当使用 `Thread.Sleep` 时,线程会被强制进入休眠状态,这段时间内该线程不会被调度器重新分配给其他任务,造成资源浪费。尤其在线程池环境中,这种行为可能导致线程饥饿问题[^2]。 `Task.Delay` 则利用了 .NET 的异步任务机制,在延迟期间不会占用线程资源。一旦延迟完成,任务将继续执行(可能在不同的线程上)。这种方式能够更高效地利用线程池资源,并避免不必要的线程阻塞[^3]。 #### 执行上下文和线程切换 在异步方法中使用 `await Task.Delay` 时,可能会发生线程切换。这是因为 `await` 操作符默认会在捕获的同步上下文(如 UI 上下文)中恢复执行,但如果上下文不可用,则可能在任意线程池线程上继续执行。这一特性对于保持 UI 响应性非常重要,但也增加了调试和理解代码流的复杂性[^3]。 ```csharp private async void CheckThreadId() { for (int i = 0; i < 10; i++) { await Task.Delay(1000); Console.WriteLine("线程id:" + Environment.CurrentManagedThreadId); } } ``` #### 适用场景总结 - **使用 `Thread.Sleep` 的场景**:适用于简单的控制台应用程序、后台服务中的轮询逻辑,或者不需要保持线程响应能力的短期阻塞操作。 - **使用 `Task.Delay` 的场景**:适用于所有需要异步延迟的场合,尤其是 UI 应用程序、Web 服务器端处理、长时间运行的任务控制等需要避免阻塞线程的情况。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷棵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值