.net实现作业调度
最近想写一个作业调度的服务,即定时调用某个服务,初步想法是把要调用的服务信息写成配置文件,然后调度服务直接读取配置文件中的作业列表:
每个作业都声称一个单独线程,在线程里用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();
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Quartz.NET 这个类库可以帮到你,简单高效
以下是一些入门教程:
Net作业调度(一) -Quartz.Net入门
Quartz.NET c# 教程 - 课程一: 使用 Quartz
一般不会将线程挂起太长时间,而且如果需要长时间等待,在等待过程中也需要知道线程还活着(因为有可能会有一些未能预料的原因导致线程挂掉。
要让程序知道线程还活着,最常见的方法是使用心跳检测,比如每过1个小时发送一个消息给检测线程,检测线程等待超过约定时间没收到消息就对线程进行详细检查,看调度线程是否还活着;如果调度线程已经死掉了,就需要关掉旧线程,重新开启新线程,继续调度任务。当然检测线程也是有可能挂掉的,所以为了保证安全还需要一个检查检测线程是否活着的线程……当然不能依此类推,产生两个检测线程相互检查就好了。如果实际造成线程挂掉的异常情况比较多的话,可以考虑更多的检测线程和更高的检测频率,以更可能的保证调度线程在工作。
最简单的办法当然是使用现成的框架!