C#只提供Timer定时器(C++ SetTimer 类似),通过设置一个时间间隔来定时触发执行任务。那么定点执行任务怎么实现呢?
原理:每次通过计算得出下次定点任务与现在时点的事件间隔,作为Timer的时间间隔,从而实现任务的定点执行。原理比较简单,代码中都有注释,有类似需求的童鞋可以直接用作项目中,免测试哦~~~
-
-
using System.Collections.Generic;
-
using System.ComponentModel;
-
-
using System.Diagnostics;
-
-
using System.ServiceProcess;
-
-
-
-
namespace PlanDemoService
-
-
public partial class Service1 : ServiceBase
-
-
-
-
-
-
-
-
private string onceDoStr = "18:00";
-
private DateTime onceDoTime;
-
-
-
private Timer onceDoTimer = new Timer();
-
-
-
-
-
-
-
private void OnceDoTimer_Elapsed(object sender, ElapsedEventArgs e)
-
-
UpdateOnceDoTimePeriod();
-
-
-
-
-
if (DateTime.Now.ToString("HH:mm").CompareTo(onceDoStr.Trim()) >= 0)
-
-
-
-
-
-
-
-
-
-
private void SetNextOnceDoInterval()
-
-
TimeSpan spanNextDay = new TimeSpan(1, 0, 0, 0);
-
-
if (DateTime.Now < onceDoTime)
-
-
onceDoTimer.Interval = (onceDoTime - DateTime.Now).TotalMilliseconds;
-
Loger.Log(string.Format("定时任务将于{0}执行一次。", onceDoTime.ToString("yyyy-MM-dd HH:mm:ss")), "PlanDemoService");
-
-
-
if (DateTime.Now > onceDoTime)
-
-
onceDoTimer.Interval = (onceDoTime + spanNextDay - DateTime.Now).TotalMilliseconds;
-
Loger.Log(string.Format("下次定时任务将于{0}执行一次。", (onceDoTime + spanNextDay).ToString("yyyy-MM-dd HH:mm:ss")), "PlanDemoService");
-
-
-
-
-
-
-
private void UpdateOnceDoTimePeriod()
-
-
string[] parts = onceDoStr.Split(':');
-
onceDoTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day,
-
int.Parse(parts[0]), int.Parse(parts[1]), 0);
-
-
-
-
-
-
private void onceDoMain()
-
-
Loger.Log("任务执行!", "PlanDemoService");
-
-
-
protected override void OnStart(string[] args)
-
-
-
-
UpdateOnceDoTimePeriod();
-
-
-
-
Loger.Log("时间配置有误!" + e.Message, "PlanDemoService");
-
-
-
-
onceDoTimer.Elapsed += new ElapsedEventHandler(OnceDoTimer_Elapsed);
-
-
-
-
-
protected override void OnStop()
-
-
-
Loger.Log("服务已停止!", "PlanDemoService");
-
-
-
https://blog.csdn.net/zqp2013/article/details/47419619