最近在排查项目OTA的一个问题,触发了一毫秒或者2毫秒执行一次进程间通信的,导致通信阻塞的问题。这样就需要用到模拟触发1ms或者2ms触发事件。
private Timer timer; private void TimerTest_OnClick(object sender, RoutedEventArgs e) { // 堆代码 duidaima.com 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的间隔不符合。
using Timer = System.Timers.Timer;测试的结果,发现竟然可以精确到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毫秒左右的精度。