C#定時器Timer實現(xiàn)精確到1-2毫秒以內(nèi)
前言
最近在排查項目OTA的一個問題,觸發(fā)了一毫秒或者2毫秒執(zhí)行一次進(jìn)程間通信的,導(dǎo)致通信阻塞的問題。這樣就需要用到模擬觸發(fā)1ms或者2ms觸發(fā)事件。
正文
這讓我第一時間想到了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很簡單, 就是創(chuàng)建一個按鈕,創(chuàng)建一個System.Timers.Timer,點擊后執(zhí)行,
但是執(zhí)行結(jié)果,卻是要等待10+ms,跟我們設(shè)置的1ms的間隔不符合
其實這跟PC的時鐘相關(guān),具體我就不解釋了,詳看上面鏈接的說明
我還不死心,會不會跟Dotnet的版本有關(guān)呢?
于是乎,我又創(chuàng)建了一個.Net8的 WPF的應(yīng)用,用了如上一樣的代碼,也是用到了 相同命名空間的Timer
using Timer = System.Timers.Timer;
測試的結(jié)果,發(fā)現(xiàn)竟然可以精確到1-2ms的誤差之內(nèi)
這應(yīng)該是微軟對.NET 8.0的 Timer 定時器做了優(yōu)化了。
接下來如何在.NET Framwork 4.8的環(huán)境下,實現(xiàn)精確度在1-2ms的定時執(zhí)行了,只能自己寫一個自旋的定時器,通過判斷時間的間隔方式執(zhí)行檢測。
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; } } }); }
測試的結(jié)果跟.Net8.0的Timer的效果一樣的,精確度在1-2ms之內(nèi)
接下來的項目應(yīng)該都需要往.NET 8里邊遷移才行了,可以減少很多不必要的工作量。
總結(jié)
C#中實現(xiàn)高精度定時器(1-2毫秒以內(nèi))是一個具有挑戰(zhàn)性的任務(wù),因為標(biāo)準(zhǔn)的 System.Timers.Timer 和 System.Threading.Timer 通常只能提供大約15毫秒左右的精度。
最后
到此這篇關(guān)于C#定時器Timer實現(xiàn)精確到1-2毫秒以內(nèi)的文章就介紹到這了,更多相關(guān)C# Timer精確1-2毫秒以內(nèi)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#調(diào)用OpenXml讀取excel行數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了C#如何調(diào)用OpenXml實現(xiàn)讀取excel行數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12C# Winform實現(xiàn)導(dǎo)入和導(dǎo)出Excel文件
這篇文章主要為大家詳細(xì)介紹了C# Winform實現(xiàn)導(dǎo)入和導(dǎo)出Excel文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12CPF?使用C#的Native?AOT?發(fā)布程序的詳細(xì)過程
這篇文章主要介紹了CPF?使用C#的Native?AOT?發(fā)布程序,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具體一定的參考借鑒價值,需要的朋友可以參考下2022-03-03C#與SQL連接:GridView控件對數(shù)據(jù)庫的操作
GridView控件操作方面的知識,需要的朋友可以參考一下2013-02-02