下面是之前在项目中使用到的定时器实现代码(每当项目重新启动时执行ExecutionTimer方法)
executionTime :定时执行的时间,我设置的是每天19点定时执行一次,也可以把这个拎出去,当作参数传入,做次封装
timeSpan :当前时间与设定执行时间的间隔,当前时间小于设定时间,该值为正数,反之为负数(单位毫秒)
interval :每当项目重新启动时计算出当前时间距离执行时间的间隔,其中 timeSpan + 1 是为了防止重启项目时当前时间恰好与执行时间一致,导致 timeSpan 为 0,使定时器报错(第一个定时器执行的时间间隔,且只执行一次)
/// <summary>
/// 执行定时器(每天定时19点执行相应方法)
/// </summary>
public static void ExecutionTimer()
{
DateTime executionTime = Convert.ToDateTime($"{DateTime.Now:yyyy-MM-dd} 19:00:00");
DateTime nowTime = DateTime.Now;
var timeSpan = (executionTime - nowTime).TotalMilliseconds;
var interval = timeSpan >= 0 ? timeSpan + 1 : (12 * 60 * 60 * 1000) + timeSpan;
// 重启网站时,如果此时的时间距离定时器执行的时间间隔大于30分钟,则执行相应方法
if (timeSpan > 30 * 60 * 1000 || (timeSpan < -1 * 30 * 60 * 1000 && timeSpan < 0))
{
ExecutionMethod();
}
System.Timers.Timer timer = new System.Timers.Timer(interval) { AutoReset = false, Enabled = true };
timer.Elapsed += (o, e) =>
{
ExecutionMethod();
System.Timers.Timer newTimer = new System.Timers.Timer(12 * 60 * 60 * 1000) { AutoReset = true, Enabled = true };
newTimer.Elapsed += (newO, newE) =>
{
ExecutionMethod();
};
newTimer.Start();
};
timer.Start();
}