C#中四種Timer定時(shí)器區(qū)別與用法的示例詳解
在 C# 開發(fā)中,計(jì)時(shí)器(Timer) 是實(shí)現(xiàn)定時(shí)執(zhí)行任務(wù)的重要工具。無論是執(zhí)行后臺(tái)輪詢、定時(shí)刷新數(shù)據(jù),還是控制程序節(jié)奏,Timer 都扮演著關(guān)鍵角色。然而,.NET 提供了多種不同類型的 Timer 類,各自適用于不同的場景和開發(fā)環(huán)境。
本文將詳細(xì)介紹 C# 中常用的四種 Timer 類型,包括它們的特性、工作原理、適用范圍以及使用方法,并通過完整的代碼示例幫助大家理解其區(qū)別與應(yīng)用場景。
一、System.Threading.Timer —— 線程級(jí)輕量計(jì)時(shí)器
特點(diǎn)
最底層、最輕量級(jí)的計(jì)時(shí)器;
基于線程池運(yùn)行,適用于非 UI 場景;
不是線程安全的;
對于時(shí)間精度要求不高的后臺(tái)任務(wù)非常合適。
示例代碼
string state = ".";
Timer timer = new Timer(TimeMethod, state, 100, 1000); // 100ms后開始,每1秒執(zhí)行一次
void TimeMethod(object state)
{
Console.WriteLine(state.ToString());
}
// 停止并釋放計(jì)時(shí)器
timer.Dispose();
應(yīng)用場景
后臺(tái)服務(wù)中輕量級(jí)的定時(shí)任務(wù);
不需要與 UI 控件交互的任務(wù);
多線程環(huán)境中對性能敏感的小型定時(shí)操作。
注意:此計(jì)時(shí)器不適合用于 WinForm 或 WPF 的 UI 操作,因?yàn)槠浠卣{(diào)函數(shù)不在主線程上執(zhí)行。
二、System.Timers.Timer —— 服務(wù)器端多線程計(jì)時(shí)器
特點(diǎn)
封裝了 System.Threading.Timer,提供了更友好的事件模型;
支持多線程環(huán)境,適合服務(wù)或 ASP.NET 應(yīng)用;
提供同步上下文設(shè)置(SynchronizingObject),避免跨線程訪問問題;
默認(rèn)自動(dòng)循環(huán)(AutoReset = true);
可能出現(xiàn)重入問題(多個(gè)線程同時(shí)進(jìn)入 Elapsed 事件)。
示例代碼
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 500; // 設(shè)置間隔為500毫秒
timer.SynchronizingObject = this; // 避免跨線程訪問UI控件的問題
timer.Elapsed += Timer_Elapsed;
timer.Start();
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Elapsed event triggered.");
}
解決重入問題的方法
可以在 Elapsed 方法中加入鎖機(jī)制或標(biāo)志位防止多線程重復(fù)執(zhí)行:
int inTimer = 0;
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (Interlocked.Exchange(ref inTimer, 1) == 0)
{
try
{
Thread.Sleep(3000);
Console.WriteLine($"Handling tick on thread: {Thread.CurrentThread.ManagedThreadId}");
}
finally
{
Interlocked.Exchange(ref inTimer, 0);
}
}
}
應(yīng)用場景
ASP.NET Web API 或后臺(tái)服務(wù)中的定時(shí)邏輯;
多線程環(huán)境下需要執(zhí)行耗時(shí)任務(wù)但需防止重入;
需要精確控制計(jì)時(shí)周期且允許異步處理的應(yīng)用。
三、System.Windows.Forms.Timer —— Windows Forms 專用計(jì)時(shí)器
特點(diǎn)
專為 WinForms 設(shè)計(jì),運(yùn)行在 UI 主線程;
安全地與界面控件進(jìn)行交互;
精度較低(約5ms),適用于簡單定時(shí)任務(wù);
只有 Interval 和 Enabled 兩個(gè)屬性,使用簡單。
示例代碼
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Load += delegate
{
Timer timer = new Timer();
timer.Interval = 500;
timer.Tick += delegate
{
lblTimer.Text = DateTime.Now.ToLongTimeString();
};
timer.Start();
};
}
}
結(jié)果分析
所有 Tick 時(shí)間都在主線程中執(zhí)行;
不會(huì)發(fā)生跨線程訪問異常,可直接修改控件;
不適合高頻率或高并發(fā)任務(wù)。
應(yīng)用場景
WinForm 界面中簡單的定時(shí)更新;
需要與 UI 控件聯(lián)動(dòng)的場合;
輕量級(jí)動(dòng)畫、狀態(tài)欄更新等。
四、System.Windows.Threading.DispatcherTimer —— WPF 專用計(jì)時(shí)器
特點(diǎn)
專為 WPF 設(shè)計(jì),運(yùn)行在 UI 主線程;
與 Dispatcher 隊(duì)列綁定,確保線程安全;
支持設(shè)置優(yōu)先級(jí)(DispatcherPriority);
可以精確控制 UI 更新時(shí)機(jī);
但受系統(tǒng)負(fù)載影響,可能存在延遲。
示例代碼
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += Timer_Tick;
timer.Start();
}
private void Timer_Tick(object sender, EventArgs e)
{
txtTime.Text = DateTime.Now.ToString("HH:mm:ss");
}
}
優(yōu)化建議
可以設(shè)置 DispatcherPriority 來提高響應(yīng)速度:
DispatcherTimer timer = new DispatcherTimer(DispatcherPriority.Normal);
應(yīng)用場景
WPF 界面上定時(shí)刷新內(nèi)容;
依賴 UI 線程的操作; 動(dòng)畫、倒計(jì)時(shí)等可視化組件任務(wù)。
定時(shí)器對比

總結(jié)
C# 中的四種 Timer 各具特色,適用于不同技術(shù)棧和開發(fā)場景:
- System.Threading.Timer:輕量高效,適合后臺(tái)任務(wù);
- System.Timers.Timer:功能豐富,適合多線程服務(wù)器開發(fā);
- System.Windows.Forms.Timer:簡潔易用,WinForm 界面首選;
- DispatcherTimer:WPF 環(huán)境下專屬計(jì)時(shí)器,安全可靠。
選擇合適的 Timer,不僅關(guān)系到程序的穩(wěn)定性與性能,也直接影響用戶體驗(yàn)。希望本文能幫助大家清晰掌握各個(gè) Timer 的使用方法與最佳實(shí)踐,在實(shí)際項(xiàng)目中游刃有余地應(yīng)用。
到此這篇關(guān)于C#中四種Timer定時(shí)器區(qū)別與用法的示例詳解的文章就介紹到這了,更多相關(guān)C# Timer定時(shí)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中DateTime的格式符的實(shí)現(xiàn)示例
本文介紹了C#中DateTime格式符的使用方法,分為預(yù)定義格式和自定義格式兩類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-12-12
C#去除DataTable重復(fù)數(shù)據(jù)的三種方法
這篇文章主要介紹了C#去除DataTable重復(fù)數(shù)據(jù)的三種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
Unity實(shí)戰(zhàn)之FlyPin(見縫插針)小游戲的實(shí)現(xiàn)
這篇文章主要介紹了利用Unity制作FlyPin(見縫插針)小游戲的實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起試一試2022-01-01
WPF實(shí)現(xiàn)虛擬鍵盤代替真實(shí)鍵盤的全過程
在工業(yè)控制、自助終端、醫(yī)療設(shè)備等場景中,物理鍵盤往往存在易損壞、體積過大、操作環(huán)境受限等問題,而WPF憑借其強(qiáng)大的界面定制能力、數(shù)據(jù)綁定特性和可視化渲染效果,能夠完美實(shí)現(xiàn)一款可替代真實(shí)鍵盤的虛擬鍵盤,本文將詳細(xì)講解WPF虛擬鍵盤的完整實(shí)現(xiàn)流程2026-01-01
淺析c#范型中的特殊關(guān)鍵字where & default
以下是對c#范型中的特殊關(guān)鍵字where和default進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下2013-09-09
c#使用filesystemwatcher監(jiān)視文件系統(tǒng)的變化
對于一個(gè)文件夾的改變,C#這邊有自己的類來實(shí)現(xiàn),我們不需要關(guān)心它的內(nèi)部實(shí)現(xiàn)機(jī)制,不需要關(guān)心它底層調(diào)用哪些API,我們只需要關(guān)心如何去調(diào)用它,如何讓它幫助我們記錄文件夾的修改情況即可,下面我們就實(shí)現(xiàn)它2014-01-01
帶著問題讀CLR via C#(筆記一)CLR的執(zhí)行模型
CLR (Common Language Runtime) 是一個(gè)可以由多種編程語言使用的“運(yùn)行時(shí)”。2013-04-04

