C# 定时器 Timer 如何精确到 1-2 毫秒以内

news/2024/10/3 12:36:31

最近在排查项目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里边迁移才行了,可以减少很多不必要的工作量。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/55251.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

浅谈 Occupancy

01 研究意义 Occupancy Network算法因为可以更好的克服感知任务中存在的长尾问题,以及更加准确表达物体的几何形状信息,而受到来自工业界和学术界越来越广泛的关注。 Occupancy Network算法本质上是一个3D分割任务,通过将想要感知的3D空间划分成固定大小的体素网格,并让算法…

BEVFormer开源算法逐行解析(一):Encoder部分

写在前面: 对于BEVFormer算法框架的整体理解,大家可以找到大量的资料参考,但是对于算法代码的解读缺乏详实的资料。因此,本系列的目的是结合代码实现细节、在tensor维度的变换中帮助读者对算法能有更直观的认识。 本系列我们将对BEVFormer公版代码(开源算法)进行逐行解析…

MySQL的索引原理及使用

B+树的最底层叶子节点包含了所有的索引项。从图上可以看到,B+树在查找数据的时候,由于数据都存放在最底层的叶子节点上,所以每次查找都需要检索到叶子节点才能查询到数据。所以在需要查询数据的情况下每次的磁盘的IO跟树高有直接的关系,但是从另一方面来说,由于数据都被放…

first-blog

各位师傅好,这里是saga131的博客 原本打算第一个博客就介绍一下自己,在github上搭建了一个博客,但是遇到了点环境问题,便转战至博客园,用第二个博客来介绍一下自己本人是从2023年10月入门CTF和取证。社团纳新面试中,我选择了密码方向,开始了crypto之路。面试结束后,CPP…

压缩大型语言模型(LLMs):缩小10倍、性能保持不变

尽管LLMs的巨大规模使其在广泛的应用场景中表现卓越,但这也为其在实际问题中的应用带来了挑战。本文将探讨如何通过压缩LLMs来应对这些挑战。我们将介绍关键概念,然后通过具体的Python代码实例进行演示。2023年人工智能领域的主导思想是"更大即更好",改进语言模型的方…

Winserver 阴影会话,远程协助相关

场景(方便管理协助其他远程会话)用户都是运行在winserver 上的一个一个远程会话,有时需要看一下客户操作了什么。换做本地客户端的情况,可以让客户开远程工具。 方式1:远程协助 有一个轻松连接,这个目前没弄出来。效果跟金万维的一样,只要知道对方IP、计算机名。还有6位…

Pulsar 入门实战(3)--安装

本文主要介绍 Pulsar 的安装,相关的环境及软件信息如下:CentOS 7.9.2009、Pulsar 3.3.0、Java 17.0.10。 1、单机版安装 为了本地开发和测试,可以以单机模式运行 Pulsar。单机模式将所有组件运行在单个 Java 虚拟机(JVM)进程内。 官网(https://pulsar.apache.org/download…

喜报!Fluent Editor 开源富文本迎来了第一位贡献者!

你好,我是 Kagol,个人公众号:前端开源星球。 2024年8月20日,刚开源一周的富文本 Fluent Editor 迎来了第一位贡献者:zzxming,带大家一起分析下这个 #10 这个PR。你好,我是 Kagol,个人公众号:前端开源星球。 2024年8月20日,刚开源一周的富文本 Fluent Editor 迎来了第…