定时器Timer
Timer可以对方法的执行时间进行调度,可以是经过指定的时间段后执行,也可以是在之后每隔一段时间执行一次。但不要创建太多的定时器。全部的Timer都是由线程池中的1个线程提供支持的。如果Timer的数量太多,则执行回调方法会被延迟。
在空闲时,Timer线程会执行线程池中的任务,Timer会由下一个可用线程来继续支持。如果任务数量太多,或者CPU的负载很高,Timer将变得不精确。Timer的精度不会高于操作系统的时钟节拍计数器(Tick)。1个Tick的默认值是15.625ms,同样也决定了Thread Quantum的时长.如果需要获得小于15ms的精度,可以选择其他方式:
- 缩小操作系统时钟的Tick间隔。这会导致CPU占用率的上升,并严重影响电池电力,但有可能适用于某些场合。
- 在循环中自旋,并使用高分辨率定时器(Stopwatch)监测时间。但会消耗更多的CPU和电力,影响范围较小。
- 调用线程Sleep阻塞线程。但在负载过重的系统中,切换出去的线程可能在预定时间间隔内切换不回来。
注意:修改Tick的值可能造成深远影响,如上下文切换次数增加、系统负载上升以及其他性能的下降。
private System.Threading.Timer timer; public void Start() { //参数分别是:回调方法,回调方法的参数,距离第一次触发的时间,之后重复触发的时间间隔。 timer = new System.Threading.Timer(TimerCallbcak, null, 15, Timeout.Infinite); //timer.Change(15, Timeout.Infinite);//作用见下文 } private void TimerCallbcak(object obj) { //执行代码 /* 不能在回调函数中写释放timer的方法。可能会在执行TimerCallback方法时抛出NullReferenceException。 * 因为Timer是在Start函数中付给timer字段的,而回调函数可能在之前就运行了。 * * 修正办法:在Start中添加一句代码,timer.Change(15, Timeout.Infinite); * */ //timer.Dispose(); }
凡所有相,皆是虚妄。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?