最近在排查项目OTA的一个问题,触发了一毫秒或者2毫秒执行一次进程间通信的,导致通信阻塞的问题。这样就需要用到模拟触发1ms或者2ms触发事件。这让我第一时间想到了C#的定时器。由于我们项目用到的框架是基于.NETFramwork4.8的,所以我就建立了一个.NETFramwork4.8的WPF Demo 去验证

 private Timer timer;

 private void TimerTest_OnClick(object sender, RoutedEventArgs e)
{
timer = new Timer();
timer.Interval = 1;
timer.Elapsed += Timer_Elapsed;
timer.Start();
} private void Timer_Elapsed(object? sender, ElapsedEventArgs e)
{
Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"));
}

Demo很简单, 就是创建一个按钮,创建一个System.Timers.Timer,点击后执行,,但是执行结果,却是要等待10+ms,跟我们设置的1ms的间隔不符合

于是乎我查阅了一番资料:c# - Thread.Sleep(1) 耗时超过 1ms_Stack Overflow中文网

其实这跟PC的时钟相关,具体我就不解释了,详看上面链接的说明

我还不死心,会不会跟Dotnet的版本有关呢?

于是乎,我又创建了一个.Net8的 WPF的应用,用了如上一样的代码,也是用到了 相同命名空间的Timer

using Timer = System.Timers.Timer;

测试的结果,发现竟然可以精确到1-2ms的误差之内

这应该是微软对.Net8.0的 Timer 定时器做了优化了。

接下来如何在.NETFramwork4.8的环境下,实现精确度在1-2ms的定时执行了,只能自己写一个自旋的定时器,通过判断时间的间隔方式执行检测。

private CancellationTokenSource tokenSource = new CancellationTokenSource();

private void SelfAutoTimer()
{
Task.Run(() =>
{
var current = DateTime.Now; while (!tokenSource.IsCancellationRequested)
{
var temp = DateTime.Now;
if ((temp - current).TotalMilliseconds >=1)
{
Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"));
current = temp;
}
}
});
}

测试的结果跟.Net8.0的Timer的效果一样的,精确度在1-2ms之内

接下来的项目应该都需要往.Net8里边迁移才行了,可以减少很多不必要的工作量。

C# 定时器 Timer 如何精确到 1-2 毫秒以内的更多相关文章

  1. 使用系统定时器SysTick实现精确延时微秒和毫秒函数

    SysTick定时器简介 SysTick定时器是存在于系统内核的一个滴答定时器,只要是ARM Cortex-M0/M3/M4/M7内核的MCU都包含这个定时器,它是一个24位的递减定时器,当计数到 0 ...

  2. python中实现定时器Timer

    实现定时器最简单的办法是就是循环中间嵌time.sleep(seconds), 这里我就不赘述了 # encoding: UTF-8 import threading #Timer(定时器)是Thre ...

  3. 订餐系统之定时器Timer不定时

    经过几天漫长的问题分析.处理.测试.验证,定时器Timer终于定时了,于是开始了这篇文章,希望对还在纠结于“定时器Timer不定时”的同学有所帮助,现在的方案,在系统日志中会有警告,如果您有更好的方案 ...

  4. PHP框架Swoole的一个定时器Timer特性

    在各种业务型系统中,往往需要服务器在后台扫描相关数据,触发相应的统计.通知等操作. 比如对于一个项目管理系统,需要每天的特定时间内,统计每项任务的执行.到期情况.整个项目的进度等等,根据统计情况,做相 ...

  5. C#创建windows服务搭配定时器Timer使用实例(用代码做,截图版)

       功能说明:C#创建一个windows服务,服务启动时D:\mcWindowsService.txt写入数据,服务运行期间每隔两秒写入当前时间. 原理这些就不说了,三语两语说不清楚,直接贴一个实例 ...

  6. iOS 定时器Timer常见问题

    最近有朋友问我使用NStimer遇见与ScrollView并存时存在主线程阻塞的问题,自己总结几种解决方法: 问题原因: 一般定时器timer都会被以默认模式default添加到主线程的runloop ...

  7. 定时器Timer不定时

    订餐系统之定时器Timer不定时 经过几天漫长的问题分析.处理.测试.验证,定时器Timer终于定时了,于是开始了这篇文章,希望对还在纠结于“定时器Timer不定时”的同学有所帮助,现在的方案,在系统 ...

  8. 多线程&定时器Timer&同步&线程通信&ThreadLocal

    1.多线程 线程状态分为:新建状态.就绪状态.运行状态.阻塞状态.死亡状态 对象等待池的阻塞状态:运行状态执行了wait方法 对向锁池的阻塞状态:试图获得某个同步锁,已经被其他线程占用,就会放到对象的 ...

  9. Java进阶(十八)Java实现定时器(Timer)

    Java实现定时器(Timer) 绪 在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等.对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类.java.u ...

  10. 定时器Timer&ScheduledThreadPoolExecutor

    定时器Timer&ScheduledThreadPoolExecutor /** * @ClassName: TimerTest * @author: daniel.zhao * @date: ...

随机推荐

  1. Java Properties配置文件和XML配置文件读取

    一.properties类读取配置文件 1.从项目中读取properties配置文件,新建一个main程序,对应位置建立一个名称为config.properties配置文件,随意放置一些键值对.IDE ...

  2. Note_Fem边界条件的处理和numpy实现的四种方法

    将单元刚度矩阵组装为全局刚度矩阵后,有: 此时的线性方程没有唯一解,\([K]\)是奇异矩阵,这是没有引入边界条件,消除刚体位移的原因. 边界条件分为两类:Forced and Geometric;对 ...

  3. class com.ttsx.activity.item.dao.entity.RoleMenu ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method. 报错解决办法

    启动项目的时候,有几条WARN警告,如图: 引起原因: 是因为数据表实体类 没有di导致的. 例如: 解决办法: 增加实体id字段!或可以忽略!不影响程序!

  4. 🧠ChatGPT 中文提示语大全【超全 Prompt 用法】- 已分类

    基于 awesome-chatgpt-prompts 进行分类,更方便查找自己所需,炼制适合自己的ChatGPT法宝. 工作 简历写手 我需要你写一份<2年工作经验的前端工程师>的简历,你 ...

  5. 130道基础OJ编程题之: 89~107

    130道基础OJ编程题之: 89~107 @ 目录 130道基础OJ编程题之: 89~107 89. BC101 班级成绩输入输出 99. BC102 矩阵元素定位 100. BC103 序列重组矩阵 ...

  6. 数据质量框架QUalitis浅尝使用

    数据质量管理平台(微众银行)Qualitis+Linkis (一)Qualitis是一个数据质量管理系统,用于监控数据质量. 其功能包括: 数据质量模型定义 数据质量结果可视化 可监控 数据质量管理服 ...

  7. 关于er图的几个工具

    建立数据库包括其他的er图,这个太重要了.因为这关于效率和清晰思路. 但是目前感觉好用的还是ER/Studio.如果不差银子还是建议用这一款.真的好方便. 1.正向逆向工程非常顺利和快捷. 2.物理模 ...

  8. github release 下载文件慢、或者失败的解决方法

    Free Download Manager 下载工具可以解决Github 下载缓慢或失败问题. 扫描下方二维码,关注公众号 回复github,即可获取下载链接.

  9. python 工具uv

    以下是 Python 环境管理工具 uv 从入门到精通的系统性指南,基于 2025 年最新版本特性整理: 一.uv 核心优势与适用场景 极速性能 • 基于 Rust 开发,依赖解析速度比传统工具快 1 ...

  10. zk源码—1.数据节点与Watcher机制及权限

    大纲 1.ZooKeeper的数据模型.节点类型与应用 (1)数据模型之树形结构 (2)节点类型与特性(持久 + 临时 + 顺序 ) (3)节点的状态结构(各种zxid + 各种version) (4 ...