C# 提供了多种定时器Timer实现,不同Timer适用于不同的开发场景,比如桌面应用、服务端后台任务等,下面通过具体实例介绍各类Timer的使用方法。
System.Timers.Timer 实例
System.Timers.Timer 是常用的定时器类型,适合需要在指定间隔触发事件的后台任务场景,下面是一个每隔1秒输出当前时间的实例。
using System;
using System.Timers;
namespace TimerDemo
{
class Program
{
static void Main(string[] args)
{
// 创建定时器,设置触发间隔为1000毫秒(1秒)
Timer timer = new Timer(1000);
// 绑定定时触发事件
timer.Elapsed += Timer_Elapsed;
// 设置定时器自动重置,即每次间隔后都触发
timer.AutoReset = true;
// 启动定时器
timer.Enabled = true;
Console.WriteLine("定时器已启动,按任意键退出");
Console.ReadKey();
// 停止并释放定时器资源
timer.Stop();
timer.Dispose();
}
// 定时触发时执行的方法
private static void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine($"当前时间:{DateTime.Now}");
}
}
}
System.Threading.Timer 实例
System.Threading.Timer 更偏向底层线程调度,适合需要灵活控制回调方法的场景,下面是一个延迟3秒后执行,之后每隔2秒重复执行的实例。
using System;
using System.Threading;
namespace ThreadingTimerDemo
{
class Program
{
static void Main(string[] args)
{
// 第一个参数是回调方法,第二个是回调方法的参数,第三个是延迟执行时间(3秒),第四个是重复间隔(2秒)
Timer timer = new Timer(CallbackMethod, null, 3000, 2000);
Console.WriteLine("定时器已启动,按任意键退出");
Console.ReadKey();
// 释放定时器资源
timer.Dispose();
}
// 定时器回调方法
private static void CallbackMethod(object state)
{
Console.WriteLine($"线程定时器触发,当前时间:{DateTime.Now}");
}
}
}
Windows Forms 中的 Timer 实例
如果开发Windows Forms桌面应用,需要使用System.Windows.Forms.Timer,它会在UI线程上触发事件,适合更新界面元素的场景,下面是每隔500毫秒更新标签文本的实例。
using System;
using System.Windows.Forms;
namespace WinFormsTimerDemo
{
public partial class Form1 : Form
{
private System.Windows.Forms.Timer uiTimer;
public Form1()
{
InitializeComponent();
InitTimer();
}
private void InitTimer()
{
uiTimer = new System.Windows.Forms.Timer();
// 设置触发间隔为500毫秒
uiTimer.Interval = 500;
// 绑定触发事件
uiTimer.Tick += UiTimer_Tick;
// 启动定时器
uiTimer.Start();
}
private void UiTimer_Tick(object sender, EventArgs e)
{
// 更新标签显示当前时间,因为是在UI线程执行,所以可以直接操作控件
label1.Text = $"当前时间:{DateTime.Now:HH:mm:ss}";
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// 窗体关闭时释放定时器资源
uiTimer.Stop();
uiTimer.Dispose();
}
}
}
Timer 使用注意事项
- 使用完Timer后要及时调用
Stop和Dispose方法释放资源,避免内存泄漏。 - System.Timers.Timer和System.Threading.Timer的回调方法运行在后台线程,不能直接操作UI控件,需要跨线程调用时使用控件的
Invoke方法。 - 如果定时任务执行时间超过定时间隔,需要考虑任务重入问题,可以通过加锁或者设置标志位避免重复执行。
- 设置定时间隔时,单位是毫秒,要注意数值的合理性,过短的间隔可能会导致CPU占用过高。