Net框架下有多种定时器,下面是其中两种使用的说明
一、system.timers.timer
1、普通使用,每隔一段时间执行一次,缺点:如果执行任务时间大于间隔时间,会造成多次启动定时器
private void Start()
{
System.Timers.Timer oTimer = new System.Timers.Timer(60 * 60 * 1000);
oTimer.Elapsed += new ElapsedEventHandler(AmWork);
oTimer.AutoReset = true;
oTimer.Enabled = true;
}
public void AmWork(object source, ElapsedEventArgs e)
{
Console.WriteLine("I‘m working.");
}
2、防止多次启动使用,执行的时候,停止定时器,执行完毕之后,开启定时器
public void Start()
{
System.Timers.Timer oTimer = new System.Timers.Timer(2*1000);
Action<object, System.Timers.ElapsedEventArgs> amWork = (sender, e) =>
{
oTimer.Stop();
Console.WriteLine("working:" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
System.Threading.Thread.Sleep(5000);
oTimer.Start();
};
oTimer.Elapsed += new System.Timers.ElapsedEventHandler(amWork);
oTimer.AutoReset = true;
oTimer.Enabled = true;
}
二、System.Threading.Timer定时器:不但可以设置间隔时间,也可以设置第一次执行间隔时间,有助于程序启动时,自定义第一次执行间隔时间
1、普通使用
System.Threading.Timer timer = null;
Action<object> timerHandler = state =>
{
Console.WriteLine("working:" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
};
timer = new System.Threading.Timer(new System.Threading.TimerCallback(timerHandler), null, 1000, 2000);
2、防止多次启动使用,但使用了Change之后,change执行间隔时间,必须使用第一次执行时间,好像有点问题
System.Threading.Timer timer = null;
Action<object> timerHandler = state =>
{
timer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); //可防止上次任务没有执行完毕,重启计时器
Console.WriteLine("working:" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
timer.Change(3000, 3000);
};
timer = new System.Threading.Timer(new System.Threading.TimerCallback(timerHandler), null, 1000, 1000);