C#定时器Timer实现精确到1-2毫秒以内
前言
最近在排查项目OTA的一个问题,触发了一毫秒或者2毫秒执行一次进程间通信的,导致通信阻塞的问题。这样就需要用到模拟触发1ms或者2ms触发事件。
正文
这让我第一时间想到了C#的定时器。
由于我们项目用到的框架是基于.NET Framwork 4.8 的,所以我就建立了一个.NET Framwork 4.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的间隔不符合
其实这跟PC的时钟相关,具体我就不解释了,详看上面链接的说明
我还不死心,会不会跟Dotnet的版本有关呢?
于是乎,我又创建了一个.Net8的 WPF的应用,用了如上一样的代码,也是用到了 相同命名空间的Timer
using Timer = System.Timers.Timer;
测试的结果,发现竟然可以精确到1-2ms的误差之内
这应该是微软对.NET 8.0的 Timer 定时器做了优化了。
接下来如何在.NET Framwork 4.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之内
接下来的项目应该都需要往.NET 8里边迁移才行了,可以减少很多不必要的工作量。
总结
C#中实现高精度定时器(1-2毫秒以内)是一个具有挑战性的任务,因为标准的 System.Timers.Timer 和 System.Threading.Timer 通常只能提供大约15毫秒左右的精度。
最后
到此这篇关于C#定时器Timer实现精确到1-2毫秒以内的文章就介绍到这了,更多相关C# Timer精确1-2毫秒以内内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
异步/多线程/任务/并行编程之一:如何选择合适的多线程模型?
本篇文章小编为大家介绍,异步/多线程/任务/并行编程之一:如何选择合适的多线程模型?需要的朋友参考下2013-04-04C#中使用DataContractSerializer类实现深拷贝操作示例
这篇文章主要介绍了C#中使用DataContractSerializer类实现深拷贝操作示例,本文给出了实现深拷贝方法、测试深拷贝方法例子、DataContractSerializer类实现深拷贝的原理等内容,需要的朋友可以参考下2015-06-06Unity UGUI的CanvasScaler画布缩放器组件介绍使用
这篇文章主要为大家介绍了Unity UGUI的CanvasScaler画布缩放器组件介绍使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-07-07
最新评论