C#中多種高效定時(shí)器方法的使用詳解
在 C# 中,定時(shí)器是一種常用的機(jī)制,可以周期性地執(zhí)行某個(gè)任務(wù)或事件。常見的定時(shí)器有 System.Timers.Timer 和 System.Threading.Timer,它們?cè)谑褂蒙嫌兴煌?,但都可以滿足基本的定時(shí)功能。
然而,在某些場(chǎng)景下,我們需要使用定時(shí)器的高級(jí)用法,以滿足更高的要求。比如,需要占用資源極少、準(zhǔn)確度極高的定時(shí)器,以避免在高負(fù)載情況下出現(xiàn)性能問題,或者需要精確控制定時(shí)器的執(zhí)行時(shí)間,以確保任務(wù)的準(zhǔn)確性和穩(wěn)定性。
下面介紹一些 C# 中定時(shí)器的高級(jí)用法,可以幫助我們實(shí)現(xiàn)占用資源極少、準(zhǔn)確度極高的定時(shí)器。
使用 System.Threading.Timer 和 ManualResetEventSlim
System.Threading.Timer 是一種輕量級(jí)的定時(shí)器,可以設(shè)置回調(diào)函數(shù)和時(shí)間間隔。為了占用資源更少,可以使用 ManualResetEventSlim 對(duì)回調(diào)函數(shù)進(jìn)行同步處理。
具體實(shí)現(xiàn)方法如下:
private static Timer _timer; private static ManualResetEventSlim _resetEvent; public static void StartTimer(TimeSpan interval, Action action) { _resetEvent = new ManualResetEventSlim(false); _timer = new Timer(state => action(), null, TimeSpan.Zero, interval); } public static void StopTimer() { _resetEvent.Set(); _timer.Dispose(); } public static void Wait() { _resetEvent.Wait(); }
在使用時(shí),可以調(diào)用 StartTimer 方法來啟動(dòng)定時(shí)器,調(diào)用 StopTimer 方法來停止定時(shí)器,調(diào)用 Wait 方法來等待定時(shí)器完成執(zhí)行。在回調(diào)函數(shù)中,如果需要進(jìn)行 IO 操作或者 CPU 密集型計(jì)算,可以使用異步方式或者將任務(wù)交給線程池,避免阻塞主線程。
使用 Stopwatch 和 Sleep 方法
Stopwatch 是一種高精度的計(jì)時(shí)器,可以用來測(cè)量時(shí)間間隔,Sleep 方法可以暫停當(dāng)前線程一定的時(shí)間。結(jié)合使用這兩種方法,可以實(shí)現(xiàn)準(zhǔn)確度極高的定時(shí)器。
具體實(shí)現(xiàn)方法如下:
public static void Sleep(TimeSpan interval, Action action) { var sw = Stopwatch.StartNew(); while (sw.Elapsed < interval) { Thread.Sleep(1); } action(); }
在使用時(shí),可以調(diào)用 Sleep 方法來等待指定的時(shí)間間隔,然后執(zhí)行回調(diào)函數(shù)。在回調(diào)函數(shù)中,同樣需要注意防止阻塞主線程。
使用 Task.Delay 和 async/await
Task.Delay 是一種異步等待方法,可以用來暫停當(dāng)前任務(wù)一定的時(shí)間。結(jié)合使用 async/await,可以實(shí)現(xiàn)異步且占用資源較少的定時(shí)器。
具體實(shí)現(xiàn)方法如下:
public static async Task Delay(TimeSpan interval, Func<Task> func) { while (true) { await Task.Delay(interval); await func(); } }
另一種方式是使用ThreadPoolTimer類。ThreadPoolTimer是WinRT API的一部分,它提供了一種輕量級(jí)的方式來創(chuàng)建周期性的定時(shí)器。相對(duì)于DispatcherTimer,ThreadPoolTimer消耗的資源更少,并且在應(yīng)用程序掛起時(shí)也可以繼續(xù)工作。
ThreadPoolTimer類提供了兩種創(chuàng)建方式:一種是使用CreatePeriodicTimer方法創(chuàng)建一個(gè)周期性的定時(shí)器,另一種是使用CreateTimer方法創(chuàng)建一個(gè)一次性的定時(shí)器。
下面是使用ThreadPoolTimer創(chuàng)建周期性定時(shí)器的示例代碼:
using Windows.System.Threading; public class MyTimer { private ThreadPoolTimer timer; public MyTimer() { // 創(chuàng)建周期性定時(shí)器,每隔1秒觸發(fā)一次 timer = ThreadPoolTimer.CreatePeriodicTimer(TimerElapsedHandler, TimeSpan.FromSeconds(1)); } private void TimerElapsedHandler(ThreadPoolTimer source) { // 定時(shí)器到期后執(zhí)行的代碼 } }
注意,ThreadPoolTimer的TimerElapsedHandler回調(diào)方法運(yùn)行在一個(gè)單獨(dú)的線程上,因此需要注意線程安全。
除了上述兩種方式,還有一些其他的定時(shí)器實(shí)現(xiàn)方式,比如基于Windows API的Multimedia Timer,以及基于C#的定時(shí)器庫Quartz.net。這些方式都有各自的優(yōu)點(diǎn)和缺點(diǎn),選擇合適的定時(shí)器實(shí)現(xiàn)方式需要根據(jù)具體應(yīng)用場(chǎng)景進(jìn)行評(píng)估。
所以,C#中有多種方式實(shí)現(xiàn)高效、精準(zhǔn)的定時(shí)器。在選擇定時(shí)器實(shí)現(xiàn)方式時(shí),需要考慮定時(shí)器的準(zhǔn)確度、資源占用、應(yīng)用程序掛起后是否可以繼續(xù)工作等因素,并根據(jù)具體應(yīng)用場(chǎng)景進(jìn)行評(píng)估。
到此這篇關(guān)于C#中多種高效定時(shí)器方法的使用詳解的文章就介紹到這了,更多相關(guān)C# 定時(shí)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)日期格式轉(zhuǎn)換的公共方法類實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)日期格式轉(zhuǎn)換的公共方法類,結(jié)合完整實(shí)例形式分析了C#針對(duì)各種常見日期格式的轉(zhuǎn)換方法,涉及C#字符串、日期、時(shí)間相關(guān)操作技巧,需要的朋友可以參考下2017-01-01利用C#實(shí)現(xiàn)獲取當(dāng)前設(shè)備硬件信息
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)獲取當(dāng)前設(shè)備硬件信息的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-03-03