C#-Windows服務+Quartz定時任務


      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     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM