C# Quartz.Net 定时任务的简单使用
最近做了一个定时执行任务的软件。
执行任务时,会使用log4net记录日志,如果执行任务有异常,则发送邮件给指定的对象。
我做的是每天的9点和16点执行一次任务,以此记录:
首先,获得Quartz.Net,
其实可以使用vs2015的Nuget管理器,下载。
我做了一个QuartzHelper,但是在主程序中,还是需要其他代码的。
这是QuartzHelper的代码:
1 using Quartz;
2 using Quartz.Impl;
3
4 namespace Cong.Utility
5 {
6 public class QuartzHelper
7 {
8 /// <summary>
9 /// 时间间隔执行任务
10 /// </summary>
11 /// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
12 /// <param name="seconds">时间间隔(单位:毫秒)</param>
13 public static void ExecuteInterval<T>(int seconds) where T : IJob
14 {
15 ISchedulerFactory factory = new StdSchedulerFactory();
16 IScheduler scheduler = factory.GetScheduler();
17
18 //IJobDetail job = JobBuilder.Create<T>().WithIdentity("job1", "group1").Build();
19 IJobDetail job = JobBuilder.Create<T>().Build();
20
21 ITrigger trigger = TriggerBuilder.Create()
22 .StartNow()
23 .WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).RepeatForever())
24 .Build();
25
26 scheduler.ScheduleJob(job, trigger);
27
28 scheduler.Start();
29 }
30
31 /// <summary>
32 /// 指定时间执行任务
33 /// </summary>
34 /// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
35 /// <param name="cronExpression">cron表达式,即指定时间点的表达式</param>
36 public static void ExecuteByCron<T>(string cronExpression) where T : IJob
37 {
38 ISchedulerFactory factory = new StdSchedulerFactory();
39 IScheduler scheduler = factory.GetScheduler();
40
41 IJobDetail job = JobBuilder.Create<T>().Build();
42
43 //DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
44 //DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddYears(2), 3);
45
46 ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
47 //.StartAt(startTime).EndAt(endTime)
48 .WithCronSchedule(cronExpression)
49 .Build();
50
51 scheduler.ScheduleJob(job, trigger);
52
53 scheduler.Start();
54
55 //Thread.Sleep(TimeSpan.FromDays(2));
56 //scheduler.Shutdown();
57 }
58 }
59
60 #region 任务执行例
61 //public class MyJob : IJob
62 //{
63 // public void Execute(IJobExecutionContext context)
64 // {
65 // Console.WriteLine("executed..." + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
66 // }
67 //}
68 #endregion
69 }
大概的过程是这样的:
通过ISchedulerFactory实例化一个计划工厂对象,并使用工厂实例化一个scheduler计划对象,
然后实例化一个任务对象job,也就是定义任务内容的对象,需要传入一个实现IJob接口的类,这里我使用了泛型,
接着,需要一个能触发任务的对象,这里有两种,
一种是ITrigger,这是用于规格时间间隔,计划开始后,会根据间隔的时间值,触发执行任务;
另一种是ICronTrigger,这是通过Cron表达式规格执行的时间,计划开始后,如果时间符合规定时间,就触发执行任务。
最后,把job和trigger都传入计划scheduler,计划开始。
最下方的任务执行例是一个例子,
必须实现IJob接口和Execute方法。
如果需要在Execute方法内,调用类外部的数据,我是通过在项目中定义静态类的方法,供MyJob调用的。
程序开始计划的代码:
string cronExpression = "0 0 9,16 * * ? "; =>这是指每天的9点和16点执行任务
QuartzHelper.ExecuteByCron<MyJob>(cronExpression); =>这是调用Cron计划方法
简单说一下Cron表达式吧,
"0 0 9,16 * * ? ",
顺序从左到右
0:秒
0:分
9,16:小时,逗号分隔
如果需要更详细的说明,可以百度。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示