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

 更新时间:2024年12月02日 08:53:49   作者:小码编匠  
最近在排查项目OTA的一个问题,触发了一毫秒或者2毫秒执行一次进程间通信的,导致通信阻塞的问题,这样就需要用到模拟触发1ms或者2ms触发事件,所以本文给大家介绍了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毫秒以内内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#利用deskew算法实现图像文本倾斜校正

    C#利用deskew算法实现图像文本倾斜校正

    这篇文章主要为大家详细介绍了C#如何利用deskew算法实现图像文本倾斜校正,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • C#实现微信红包功能

    C#实现微信红包功能

    这篇文章主要介绍了C#实现微信红包功能,使用正态分布计算红包金额,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • C#调用OpenXml读取excel行数据

    C#调用OpenXml读取excel行数据

    这篇文章主要为大家详细介绍了C#如何调用OpenXml实现读取excel行数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • C#4.0新特性之协变与逆变实例分析

    C#4.0新特性之协变与逆变实例分析

    这篇文章主要介绍了C#4.0新特性的协变与逆变,是比较实用的一个新功能,需要的朋友可以参考下
    2014-09-09
  • C#实现属于自己的QQ截图工具

    C#实现属于自己的QQ截图工具

    这篇文章主要为大家详细介绍了C#实现属于自己的QQ截图工具的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • C# Winform实现导入和导出Excel文件

    C# Winform实现导入和导出Excel文件

    这篇文章主要为大家详细介绍了C# Winform实现导入和导出Excel文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • C#实现上位机与欧姆龙PLC通讯(FINS)

    C#实现上位机与欧姆龙PLC通讯(FINS)

    这篇文章主要介绍了C#实现上位机与欧姆龙PLC通讯(FINS)方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • CPF 使用C#的Native AOT 发布程序的详细过程

    CPF 使用C#的Native AOT 发布程序的详细过程

    这篇文章主要介绍了CPF 使用C#的Native AOT 发布程序,本文给大家介绍的非常详细,对大家的学习或工作具体一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • UGUI ScrollRect滑动定位优化详解

    UGUI ScrollRect滑动定位优化详解

    这篇文章主要为大家详细介绍了UGUI ScrollRect滑动定位优化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#与SQL连接:GridView控件对数据库的操作

    C#与SQL连接:GridView控件对数据库的操作

    GridView控件操作方面的知识,需要的朋友可以参考一下
    2013-02-02

最新评论