1 什么是Quartz.NET?
Quartz是一个功能齐全的开源作业调度系统,可以与几乎任何其他软件系统集成或一起使用。
2 为什么需要Quartz.NET?
.NET Framework通过System.Timers.Timer类具有“内置”计时器功能-为什么有人使用Quartz而不是这些标准功能?
原因有很多!这里有一些:
计时器没有持久性机制。
计时器的时间安排不灵活(只能设置开始时间和重复间隔,没有基于日期,一天中的时间等信息)。
计时器不使用线程池(每个计时器一个线程)
计时器没有真正的管理方案-您必须编写自己的机制以能够按名称记住,组织和恢复任务等。
3 如何使用Quartz.NET?
首先,安装Quartz
Quartz
//新建HelloJob
类,并继承IJob
复制代码 隐藏代码using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Quartz; namespace ConsoleApp2 { public class HelloJob : IJob { public Task Execute(IJobExecutionContext context) { //需要执行的任务,到后面需要封装 Console.WriteLine("Hello " + DateTime.Now); return Task.CompletedTask; } } }
最后,实例化并启动调度程序,并调度要执行的作业:
复制代码 隐藏代码using System; using System.Threading.Tasks; using Quartz; using Quartz.Impl; namespace ConsoleApp2 { class Program { static async Task Main(string[] args) { Console.WriteLine("开始调度!"); //1、创建一个调度 var factory = new StdSchedulerFactory(); var scheduler = await factory.GetScheduler(); await scheduler.Start(); //2、创建一个任务 var job = JobBuilder.Create<HelloJob>() .WithIdentity("job1", "group1") .Build(); //3、创建一个触发器 var trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithCronSchedule("0/5 * * * * ?") //5秒执行一次 .Build(); await scheduler.ScheduleJob(job, trigger); Console.ReadKey(); } } }
F5执行调试,隔五秒执行一次。需要更改执行时间,需要更换Corn表达式。
4 Cron表达式
介绍
cron是已存在很长时间的UNIX工具,因此其调度功能强大且经过验证。
cron表达式是由7段构成:秒 分 时 日 月 星期 年(可选)
直接推荐在线表达式地址,没有任何推广成分,都是我平时用的
- "*" 用于选择字段中的所有值,例如,在分钟字段中表示“每分钟”。
- "?" 在需要在允许使用字符的两个字段之一中指定某些内容而在另一个不允许使用的字段中指定内容时很有用。例如,如果我希望触发器在每月的某个特定日期(例如10号)触发,但不在乎是星期几,则将其10输入“月日”字段,以及?“星期几”字段中。
- "-" 用于指定范围。例如,10-12在小时字段中表示“小时10、11和12”。
- "," 用于指定其他值。例如,MON,WED,FRI在“星期几”字段中表示“星期一,星期三和星期五的日子”。
- "/" 用于指定增量。例如,0/15在秒字段中表示“秒0、15、30和45”。和5/15在秒字段的意思是“秒5,20,35和50”。
- "L" 在允许使用的两个字段中都有不同的含义。例如,“L月日”字段中的值表示“月的最后一天”
- "W" 用于指定最接近给定日期的工作日(星期一至星期五)。例如,如果您要指定“15W月日”字段的值,则含义是:“离月15日最近的工作日”。
- "#" 用于指定每月的“第n个” XXX天。例如,“6#3星期几”字段中的值表示“每月的第三个星期五”(第6天=星期五,“#3” =每月的第三个星期五)。