一、System.Timers.Timer多线程定时器
System.Timers.Timer作为服务器和多线程定时器,由于其可以在多个线程之间移动来处理触发 Elapsed 的事件,因此在引发事件时效性方面其比windows定时器更加准确。
System.Timers.Timer没有用户界面,在运行时不可见。
下面介绍一个使用例程:
using System;
using System.Timers;
public class Example
{
private static System.Timers.Timer aTimer;
public Example()
{
SetTimer(); // 初始化定时器
}
// 初始化定时器
private static void SetTimer()
{
// 创建一个每2000ms运行一次的定时器
aTimer = new System.Timers.Timer(2000);
// 绑定回调函数
aTimer.Elapsed += OnTimedEvent;
// 设置自动复位,如若不设置,回调函数只会执行一次
aTimer.AutoReset = true;
// 使能定时器,相当于开关功能
aTimer.Enabled = true;
}
// 定时器回调函数
private static void OnTimedEvent(Object source, ElapsedEventArgs e)
{
// 控制台打印
Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
e.SignalTime);
}
}
二、System.Timers.Timer使用注意
由于System.Timers.Timer为多线程定时器,因此当定时器被触发时,其不会顾及上一个回调函数有没有运行完成,而是直接开启一个线程运行回调函数。
但是这样必须注意一种情况:如果上一个回调函数还没有运行完,System.Timers.Timer又再次触发,那么会有多个回调函数同时运行,这样的结果可能导致内部程序运行紊乱。
解决方法也很简单,只需要给回调函数加个锁使的同时刻只有一个函数运行即可,详情参阅这位博主的博客(C# 定时执行方法: System.Timers.Timer及Winform使用线程,委托定时更新界面UI控件,解决界面卡顿问题_c# system.timers.timer 会卡主ui-CSDN博客),写的很清晰具体。