LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C# 四種 Timer 定時器區別與用法(含代碼示例)

admin
2025年6月21日 10:17 本文熱度 68

前言

在 C# 開發中,計時器(Timer) 是實現定時執行任務的重要工具。無論是執行后臺輪詢、定時刷新數據,還是控制程序節奏,Timer 都扮演著關鍵角色。然而,.NET 提供了多種不同類型的 Timer 類,各自適用于不同的場景和開發環境。

本文將詳細介紹 C# 中常用的四種 Timer 類型,包括它們的特性、工作原理、適用范圍以及使用方法,并通過完整的代碼示例幫助大家理解其區別與應用場景。

一、System.Threading.Timer —— 線程級輕量計時器

特點

最底層、最輕量級的計時器;

基于線程池運行,適用于非 UI 場景;

不是線程安全的;

對于時間精度要求不高的后臺任務非常合適。

示例代碼

string state = ".";
Timer timer = new Timer(TimeMethod, state, 1001000); // 100ms后開始,每1秒執行一次

void TimeMethod(object state)
{
    Console.WriteLine(state.ToString());
}
// 停止并釋放計時器
timer.Dispose();

應用場景

后臺服務中輕量級的定時任務;

不需要與 UI 控件交互的任務;

多線程環境中對性能敏感的小型定時操作。

?? 注意:此計時器不適合用于 WinForm 或 WPF 的 UI 操作,因為其回調函數不在主線程上執行。

二、System.Timers.Timer —— 服務器端多線程計時器

特點

封裝了 System.Threading.Timer,提供了更友好的事件模型;

支持多線程環境,適合服務或 ASP.NET 應用;

提供同步上下文設置(SynchronizingObject),避免跨線程訪問問題;

默認自動循環(AutoReset = true);

可能出現重入問題(多個線程同時進入 Elapsed 事件)。

示例代碼

System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 500// 設置間隔為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 方法中加入鎖機制或標志位防止多線程重復執行:

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);
        }
    }
}

應用場景

ASP.NET Web API 或后臺服務中的定時邏輯;

多線程環境下需要執行耗時任務但需防止重入;

需要精確控制計時周期且允許異步處理的應用。

三、System.Windows.Forms.Timer —— WinForm 專用計時器

特點

專為 WinForm設計,運行在 UI 主線程;

安全地與界面控件進行交互;

精度較低(約5ms),適用于簡單定時任務;

只有 Interval 和 Enabled 兩個屬性,使用簡單。

示例代碼

public partialclassForm1 : Form
{
    public Form1()
    {
        InitializeComponent();
        Load += delegate
        {
            Timer timer = new Timer();
            timer.Interval = 500;
            timer.Tick += delegate
            {
                lblTimer.Text = DateTime.Now.ToLongTimeString();
            };
            timer.Start();
        };
    }
}

結果分析

所有 Tick 時間都在主線程中執行;

不會發生跨線程訪問異常,可直接修改控件;

不適合高頻率或高并發任務。

應用場景

WinForm 界面中簡單的定時更新;

需要與 UI 控件聯動的場合;

輕量級動畫、狀態欄更新等。

四、System.Windows.Threading.DispatcherTimer —— WPF 專用計時器

特點

專為 WPF 設計,運行在 UI 主線程;

與 Dispatcher 隊列綁定,確保線程安全;

支持設置優先級(DispatcherPriority);

可以精確控制 UI 更新時機;

但受系統負載影響,可能存在延遲。

示例代碼

public partialclassMainWindow : 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");
    }
}

優化建議

可以設置 DispatcherPriority 來提高響應速度:

DispatcherTimer timer = new DispatcherTimer(DispatcherPriority.Normal);

應用場景

WPF 界面上定時刷新內容;

依賴 UI 線程的操作; 動畫、倒計時等可視化組件任務。

定時器對比

總結

C# 中的四種 Timer 各具特色,適用于不同技術棧和開發場景:

  • System.Threading.Timer:輕量高效,適合后臺任務;

  • System.Timers.Timer:功能豐富,適合多線程服務器開發;

  • System.Windows.Forms.Timer:簡潔易用,WinForm 界面首選;

  • DispatcherTimer:WPF 環境下專屬計時器,安全可靠。

選擇合適的 Timer,不僅關系到程序的穩定性與性能,也直接影響用戶體驗。希望本文能幫助大家清晰掌握各個 Timer 的使用方法與最佳實踐,在實際項目中游刃有余地應用。


閱讀原文:原文鏈接


該文章在 2025/6/23 14:50:03 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲欧美精品综合一区 | 亚洲国产人成自精在线尤物 | 亚洲国产另类精品专区 | 亚洲精品中文字幕在线19页 | 色偷偷888欧美精品久久久 | 免费在线黄a网站 |