最近想写一个作业调度的服务,即定时调用某个服务,初步想法是把要调用的服务信息写成配置文件,然后调度服务直接读取配置文件中的作业列表:
每个作业都声称一个单独线程,在线程里用timer每分钟判断一次是否到达指定的时间,当到达指定时间时,循环调用作业的指定服务,然后线程挂起sleep指定的循环调用时间task.Interval,task.Interval设置为0则表示只执行一次。
假设我们要求每天的12点调用某个服务,我们就将task.Interval设置成86400秒,也就是线程挂起一天。
线程挂起的时间过长会不会有问题,或者说有没有更好的实现方法呢?
task.Name = string.IsNullOrWhiteSpace(task.Name) ? Guid.NewGuid().ToString() : task.Name;
DateTime startTime;
if (!DateTime.TryParse(task.StartTime, out startTime))
startTime = DateTime.Now;
task.Interval = task.Interval > 0 ? task.Interval : 0;
Thread _thread = new Thread(new ThreadStart(() =>
{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Enabled = true;
timer.Interval = 60000;//一分钟执行间隔时间,单位为毫秒
timer.Elapsed += (obj, evt) =>
{
if (!(evt.SignalTime.Date.CompareTo(startTime.Date) < 0 || evt.SignalTime.Hour < startTime.Hour || evt.SignalTime.Minute < startTime.Minute))
{
timer.Stop();
do
{
// doSomething();
Thread.Sleep(task.Interval * 1000);
} while (task.Interval > 0);
}
};
timer.Start();
}));
_thread.Start();
if (task.Interval == 0)
_thread.Abort();
Quartz.NET 这个类库可以帮到你,简单高效
以下是一些入门教程:
Net作业调度(一) -Quartz.Net入门
Quartz.NET c# 教程 - 课程一: 使用 Quartz