C#做定时任务:一是Timer;而是Quartz.net;本文就学习一下Quartz.net框架

Quartz.net非常的灵活,开发人员能用很少的代码就能完成“每隔一小时执行”、“每天2点执行”、“每月27日的下午执行8次”等各种定时任务。它实现了作业job和触发器trigger之间多对多的关系,还能把多个作业与不同的触发器关联。

开发步骤:

1、添加Quartz.dll引用

  第三方框架从“管理NuGet程序包”中搜索并添加,如果高版本安装不成功请试试低版本。我使用的”.NETFramework,Version=v4.5“,无法安装“Quartz.net 3.0.5”版本,但可以安装"2.4.1"。安装完之后会自动添加如下图所示的另外两个引用。

quartz.net定时任务框架详解

quartz.net定时任务框架详解

 2、{我建得是WindowsFrrm项目)修改Form1程序代码

using Quartz;
using Quartz.Impl;
using System;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApplication_1709
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            CodeMethod();//通过代码的方式调用
            //ConfigMethod();
        }
        public static log4net.ILog log = log4net.LogManager.GetLogger("LogLogger");

        /// <summary>
        /// 通过代码的方式调用
        /// </summary>
        private static void CodeMethod()
        {
            
            try
            {
                log.Info("-----------------" + DateTime.Now.ToString() + " Initializing ----------------------");
                //1.首先创建一个作业调度池
                ISchedulerFactory scheduler = new StdSchedulerFactory();
                IScheduler sched = scheduler.GetScheduler();
                log.Info("-----------------" + DateTime.Now.ToString() + " Initialization Complete -----------");
                log.Info("-----------------" + DateTime.Now.ToString() + " Scheduling Job  -------------------");
                //2.创建一个具体的作业
                IJobDetail job = JobBuilder.Create<PostRawMaterialDistributionPlan>().Build();
                //3.创建并配置一个触发器
                #region 每隔5秒执行一次Execute方法,无休止
                ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(5).WithRepeatCount(int.MaxValue)).Build();
                #endregion

                #region 程序每5秒执行一次,一共执行50次,开始执行时间设定在当前时间,结束时间设定在1小时候,不管50次有没有执行完,1小时候程序都不在继续执行
                //DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
                //DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddMinutes(5), 5);
                //ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime).WithSimpleSchedule(x => x.WithIntervalInSeconds(5).WithRepeatCount(50)).Build();
                #endregion

                #region 实现各种时间纬度的调用(使用cron-like):在每小时的第10、20、30分钟,每分钟的第11、27秒执行一次
                //ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime).WithCronSchedule("11,27 0,2,58 * * * ? ").Build();
                #endregion

                //4.加入作业调度池中
                sched.ScheduleJob(job, trigger);
                //5.开始执行
                sched.Start();
                log.Info("-----------------" + DateTime.Now.ToString() + " Started Scheduler -----------------");
                Thread.Sleep(TimeSpan.FromSeconds(65));//第一个线程执行之后休息65秒,第二个线程开始执行,等第十个线程执行完后刚刚好就又该第一个线程执行了,因为定时器设置的是每5秒执行一次
                log.Info("-----------------" + DateTime.Now.ToString() + " Shutting Down ---------------------");
                sched.Shutdown(true);
                log.Info("-----------------" + DateTime.Now.ToString() + " Shutdown Complete -----------------");
            }
            catch (Exception ec)
            {
                log.Error("-----------------" + DateTime.Now.ToString() + "[Error Occurred]", ec);
            }

            
        }


        /// <summary>
        /// 通过配置文件的方式调用 static
        /// </summary>
        private static void ConfigMethod()
        {
            try
            {
                log.Info("-----------------" + DateTime.Now.ToString() + " Initializing ----------------------");
                //工厂
                ISchedulerFactory factory = new StdSchedulerFactory();
                //启动
                IScheduler scheduler = factory.GetScheduler();

                scheduler.Start();
                log.Info("-----------------" + DateTime.Now.ToString() + " Started Scheduler -----------------");
                PostRawMaterialDistributionPlan job = new PostRawMaterialDistributionPlan();
                job.Execute(null);
                Thread.Sleep(TimeSpan.FromSeconds(65));//第一个线程执行之后休息65秒,第二个线程开始执行,等第十个线程执行完后刚刚好就又该第一个线程执行了,因为定时器设置的是每5秒执行一次
                log.Info("-----------------" + DateTime.Now.ToString() + " Shutting Down ---------------------");
                scheduler.Shutdown(true);
                log.Info("-----------------" + DateTime.Now.ToString() + " Shutdown Complete -----------------");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-02-17
  • 2021-12-26
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-26
相关资源
相似解决方案