首页 > 编程语言 >C# 定时器 Timer 如何精确到 1-2 毫秒以内

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

时间:2024-09-01 10:14:39浏览次数:10  
标签:Timer 2ms 定时器 C# private DateTime timer

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

 

标签:Timer,2ms,定时器,C#,private,DateTime,timer
From: https://www.cnblogs.com/wuty/p/18391037

相关文章

  • 浅谈 Occupancy
    01研究意义OccupancyNetwork算法因为可以更好的克服感知任务中存在的长尾问题,以及更加准确表达物体的几何形状信息,而受到来自工业界和学术界越来越广泛的关注。OccupancyNetwork算法本质上是一个3D分割任务,通过将想要感知的3D空间划分成固定大小的体素网格,并让算法去预测每个......
  • BEVFormer开源算法逐行解析(一):Encoder部分
    写在前面:对于BEVFormer算法框架的整体理解,大家可以找到大量的资料参考,但是对于算法代码的解读缺乏详实的资料。因此,本系列的目的是结合代码实现细节、在tensor维度的变换中帮助读者对算法能有更直观的认识。本系列我们将对BEVFormer公版代码(开源算法)进行逐行解析,以结合代码理解......
  • 通过阅读本篇文章你将了解到:CompletableFuture的使用
    通过阅读本篇文章你将了解到:CompletableFuture的使用CompletableFure异步和同步的性能测试已经有了Future为什么仍需要在JDK1.8中引入CompletableFutureCompletableFuture的应用场景对CompletableFuture的使用优化场景说明查询所有商店某个商品的价格并返回,并且查询商店某......
  • abc369 题解
    切了A~F,还挺开心(但是如果上一次把G切了的话,我就上青了QAQ比赛链接:https://atcoder.jp/contests/abc369A-369题意:给定正整数\(a,b\)(\(1\lea,b\le100\)),请问有多少个整数\(x\)满足\(a,b,x\)排序后构成等差数列。思路:观察到\(a,b\)范围很小,直接枚举\(x\)即可。......
  • 基于Python的机器学习系列(18):梯度提升分类(Gradient Boosting Classification)
    简介        梯度提升(GradientBoosting)是一种集成学习方法,通过逐步添加新的预测器来改进模型。在回归问题中,我们使用梯度来最小化残差。在分类问题中,我们可以利用梯度提升来进行二分类或多分类任务。与回归不同,分类问题需要使用如softmax这样的概率模型来处理类别标......
  • 基于Python的机器学习系列(19):K均值聚类(K-Means Clustering)
    简介        K均值聚类(K-MeansClustering)是一种常用的无监督学习算法,用于将数据样本划分为若干个“簇”,使得同一簇内的数据点彼此相似,而不同簇的数据点之间差异较大。由于K均值不依赖于标签,因此它是一种无监督学习方法。常见的应用包括客户细分、图像分割和数据可视......
  • Vue面试常见知识总结2——spa、vue按需加载、mvc与mvvm、vue的生命周期、Vue2与Vue3区
    SPASPA(SinglePageApplication,单页面应用)是一种Web应用程序架构,其核心特点是在用户与应用程序交互时,不重新加载整个页面,而是通过异步加载页面的局部内容或使用JavaScript动态更新页面。以下是对SPA的详细解析,包括其优点和缺点:SPA的优点更好的用户体验:SPA无需重新加载......
  • C# 一分钟浅谈:第一个 C# 控制台应用程序
    引言C#是一种现代化的、面向对象的编程语言,广泛应用于各种领域,包括桌面应用程序、Web应用、游戏开发等。对于初学者而言,从创建一个简单的控制台应用程序开始学习C#是一个非常好的起点。本文将详细介绍如何创建第一个C#控制台应用程序,并探讨一些常见的问题及其解决方案。准......
  • C# 一分钟浅谈:变量与数据类型简介
    引言在C#编程中,了解和使用变量与数据类型是非常基础且重要的一步。正确的数据类型选择不仅能够提高程序的性能,还能避免许多潜在的问题。本文将详细介绍C#中常见的数据类型和变量的使用方法,并探讨一些常见的问题及其解决方法。常见数据类型C#中的数据类型主要分为两大类:值......
  • 实现UDP可靠性传输(KCP介绍使用)
    1、TCP协议介绍TCP协议是基于IP协议,面向连接,可靠基于字节流的传输层协议1、基于IP协议:TCP协议是基于IP协议之上传输的,TCP协议报文中的源端口+IP协议报文中的源地址+TCP协议报文中的目标端口+IP协议报文中的目标地址,组合起来唯一确定一条TCP连接。2、面向连接:与UDP不同,TCP在传输数......