1. System.Timers.Timer 基础认知
在C#的定时器家族中,System.Timers.Timer是最典型的服务端定时器组件。与System.Threading.Timer和System.Windows.Forms.Timer不同,它专为服务器环境设计,采用基于线程池的异步触发机制。这个类位于System.dll程序集中,使用时需要引用System命名空间。
1.1 核心特性解析
Elapsed事件是System.Timers.Timer的核心机制。当Interval属性设置的时间间隔到达时,组件会通过线程池线程异步触发Elapsed事件。这种设计避免了UI线程阻塞,特别适合后台任务执行。实测中,一个配置得当的Timer实例可以稳定运行数月而不出现时间漂移。
AutoReset属性决定了定时器的触发模式:
- 设置为true时(默认值),定时器会周期性触发Elapsed事件
- 设置为false时,定时器仅触发一次Elapsed事件后自动停止
重要提示:在ASP.NET应用中直接使用System.Timers.Timer可能导致意外行为,因为IIS的应用程序池回收机制会影响定时器生命周期。建议在Windows Service中部署长期运行的定时任务。
1.2 基础使用模式
标准初始化代码模板如下:
csharp复制var timer = new System.Timers.Timer
{
Interval = 1000, // 单位:毫秒
AutoReset = true
};
timer.Elapsed += OnTimedEvent;
timer.Start();
void OnTimedEvent(object sender, ElapsedEventArgs e)
{
Console.WriteLine($"触发时间:{e.SignalTime:HH:mm:ss.fff}");
}
这段代码创建了一个每秒触发一次的定时器。实际测试发现,在i7-11800H处理器上运行该代码,时间误差通常小于15毫秒。对于精度要求更高的场景,需要配合Stopwatch类进行时间补偿。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 高级配置与性能优化
2.1 线程安全实践
Elapsed事件在线程池线程上触发,这意味着多个Elapsed事件可能同时执行。以下是一个线程安全的计数器实现:
csharp复制private readonly object _lock = new object();
private int _executionCount;
void OnTimedEvent(object sender, ElapsedEventArgs e)
{
bool lockTaken = false;
try
{
Monitor.TryEnter(_lock, 100, ref lockTaken);
if (lockTaken)
{
_executionCount++;
// 核心业务逻辑
}
}
