.net实现作业调度

发布于 2022-09-02 14:51:58 字数 1694 浏览 13 评论 0

最近想写一个作业调度的服务,即定时调用某个服务,初步想法是把要调用的服务信息写成配置文件,然后调度服务直接读取配置文件中的作业列表:
每个作业都声称一个单独线程,在线程里用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

清晰传感 2022-09-09 14:51:58

Quartz.NET 这个类库可以帮到你,简单高效

以下是一些入门教程:

Net作业调度(一) -Quartz.Net入门

Quartz.NET c# 教程 - 课程一: 使用 Quartz

故事未完 2022-09-09 14:51:58

一般不会将线程挂起太长时间,而且如果需要长时间等待,在等待过程中也需要知道线程还活着(因为有可能会有一些未能预料的原因导致线程挂掉。

要让程序知道线程还活着,最常见的方法是使用心跳检测,比如每过1个小时发送一个消息给检测线程,检测线程等待超过约定时间没收到消息就对线程进行详细检查,看调度线程是否还活着;如果调度线程已经死掉了,就需要关掉旧线程,重新开启新线程,继续调度任务。当然检测线程也是有可能挂掉的,所以为了保证安全还需要一个检查检测线程是否活着的线程……当然不能依此类推,产生两个检测线程相互检查就好了。如果实际造成线程挂掉的异常情况比较多的话,可以考虑更多的检测线程和更高的检测频率,以更可能的保证调度线程在工作。

最简单的办法当然是使用现成的框架!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文