Windows服务中,因为需要精确到特定时间执行,用Quartz代替定时器Timer。
顺便一提,Quartz如果在网页的项目中使用,Quartz会因为网页的关闭而停止,所以和Windows服务搭配较为理想。
1.新建服务
可以参考:https://www.cnblogs.com/ywkcode/p/11569593.html
2.Quartz使用
可以参考:https://www.cnblogs.com/ywkcode/p/11110126.html
代码如下:
(1)创建任务
新建“UpdateJob”类实现IJob接口
1 public class UpdateJob : IJob 2 { 3 4 public async Task Execute(IJobExecutionContext context) 5 { 6 try 7 { 8 await Task.Run(() => UpdateJobFun()); 9 } 10 catch (Exception ex) 11 { 12 await Task.Run(() => LogHelper.WriteLogs("")); 13 throw ex; 14 } 15 } 16 public void UpdateJobFun() 17 { 18 //日志记录 19 LogHelper.WriteLogs("当前时间为:"+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); 20 } 21 }
(2)创建任务调度器->创建触发器->将任务和触发器添加到调度器中
创建类“JobScheduler”
1 public class JobScheduler 2 { 3 //调度器工厂 4 private static readonly ISchedulerFactory factory = null; 5 //调度器 6 private static readonly IScheduler scheduler = null; 7 //定时规则 8 public static string QuartzCron = 9 ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).AppSettings.Settings["QuartzCron"].Value; // 10 static JobScheduler() 11 { 12 //创建一个工厂 13 factory = new StdSchedulerFactory(); 14 scheduler = factory.GetScheduler().Result; 15 scheduler.Start(); 16 } 17 public static void Start() 18 { 19 20 scheduler.GetJobGroupNames(); 21 IJobDetail job; 22 ITrigger trigger; 23 //创建任务 24 //Quartz.JobBuilder.Create<UpdateJob>().Build(); 25 job = JobBuilder.Create<UpdateJob>().Build(); 26 //创建触发器 27 trigger = TriggerBuilder.Create() 28 .WithIdentity("TimeTrigger", "TimeGroup") 29 //.WithSimpleSchedule(t => t.WithIntervalInMinutes(1).RepeatForever()) 30 .WithCronSchedule(QuartzCron) 31 .Build(); 32 //添加任务及触发器至调度器中 33 scheduler.ScheduleJob(job, trigger); 34 //启动 35 scheduler.Start(); 36 37 } 38 public static void OnStop() 39 { 40 if (!scheduler.IsShutdown) 41 { 42 scheduler.Shutdown(); 43 } 44 } 45 }
其中触发器的规则除了常用的时分秒间隔外,还能够通过Corn表达式自定义,参考规则 http://cron.qqe2.com/,本文是以每天的9点到晚上22点,整点定时执行("0 0 9,10,11,12,13,14,15,16,17,18,19,20,21,22 * * ? *")
(3)开启或结束任务
1 public partial class QuartzService : ServiceBase 2 { 3 4 private IScheduler scheduler; 5 public QuartzService() 6 { 7 InitializeComponent(); 8 9 } 10 protected override void OnStart(string[] args) 11 { 12 JobScheduler.Start(); 13 } 14 protected override void OnStop() 15 { 16 JobScheduler.OnStop(); 17 } 18 }
原文地址:https://www.cnblogs.com/ywkcode/p/12129084.html
时间: 2024-09-29 08:49:34