Windows服務中,因為需要精確到特定時間執行,用
Quartz代替定時器Timer。
順便一提,
Quartz如果在網頁的項目中使用,Quartz會因為網頁的關閉而停止,所以和Windows服務搭配較為理想。
1.新建服務
2.
Quartz使用
代碼如下:
(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 }