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"。安装完之后会自动添加如下图所示的另外两个引用。
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; } } } }