用C#实现定时/循环任务,需要使用到Quartz,在项目的NuGet包管理中可以找到并添加。一般还会伴随安装一个Log4Net,主要用它来记录在任务执行过程中遇到的问题。这边主要是讲实现定时/循环任务,就不再赘述。
要实现定时/循环任务,就需要用到C#的作业和触发器
作业:
1.作业创建:
JobBuilder.Create() 这里的 就是你实现具体任务的类
1 IJobDetail job1 = JobBuilder.Create() 2 .WithIdentity(jobName, gropName) //为该job的jobName和gropName赋值,相当于给予一个身份(非必须) 3 .UsingJobData("key", "value")//为作业的具体任务传递参数,键值对(非必须) 4 .Build();//创建作业(必须)
2.作业的具体任务
这时候要创建一个类,继承IJob,并实现接口方法,此方法是触发器触发时调用的方法,所以在这里写你的任务。
using log4net; using Quartz; using System;using System.Threading.Tasks; namespace BackgroundTask.job { public class TestJob : IJob { private readonly ILog _log = LogManager.GetLogger(typeof(TestJob));//利用Log来记录在任务执行过程中遇到的问题 public void Execute(IJobExecutionContext context) { JobDataMap dataMap = context.JobDetail.JobDataMap; string k = dataMap.GetString("key");//在这里获取到参数,有GetInt,GetXXX等等,满足参数的类型需求// 以下开始写你的任务代码, Console.WriteLine(“123321”); } } }
触发器:
1.触发器的声明
现在的版本,触发器创建和设置需要采用异步方法。
IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler(); //从工厂中获取一个调度器实例化
2.触发器的设置
循环触发器设置:
// 创建触发器 ITrigger trigger1 = TriggerBuilder.Create() .WithIdentity(tiggerName, gropName) //为触发器的tiggerName和gropName赋值,相当与给予一个身份 .StartNow() //现在开始 .WithSimpleSchedule(x => x .WithIntervalInSeconds(10) //触发时间,10秒一次。 .RepeatForever()) //不间断重复执行 .Build(); //最终创建 await scheduler.ScheduleJob(job1, trigger1); //把作业,触发器加入调度器。
await scheduler.Start();
定时触发器设置:
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() //.StartAt(startTime).EndAt(endTime) //开始时间,结束时间 .WithCronSchedule(cronExpression) //设置定时触发规则 cronExpression字符串就包含了规则 .Build(); //最终创建 await scheduler.ScheduleJob(job1, trigger); await scheduler.Start();
任务和触发器的关闭
还记得在创建作业和触发器时候给的那个身份吗?在关闭的时候可以指定关闭对象
TriggerKey triggerKey = new TriggerKey(tiggerName, gropName); JobKey jobKey = new JobKey(jobName, gropName); if (scheduler != null) { scheduler.PauseTrigger(triggerKey); scheduler.UnscheduleJob(triggerKey); scheduler.DeleteJob(jobKey); scheduler.Shutdown();// 关闭 }
自此,我们对实现定时/循环任务就有了个清晰的思路
1 新建一个控制台项目。
2 建一个类,在此类中创建作业和触发器。
3 再建一个类,此类继承IJob接口,实现Excute方法。此类作为作业的具体实行任务。
4 执行该项目。
附带知识点:
CronExpression 规则