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:小時,逗號分隔

 

如果需要更詳細的說明,可以百度。

 


免責聲明!

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



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