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