LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# 四种 Timer 定时器区别与用法(含代码示例)

admin
2025年6月21日 10:17 本文热度 18

前言

在 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