引用自:https://www.cnblogs.com/chenyucong/p/6264739.html,僅用做參考。
最近做了一個定時執行任務的軟件。
執行任務時,會使用log4net記錄日志,如果執行任務有異常,則發送郵件給指定的對象。
我做的是每天的9點和16點執行一次任務,以此記錄:
首先,獲得Quartz.Net,
其實可以使用vs2015的Nuget管理器,下載。
我做了一個QuartzHelper,但是在主程序中,還是需要其他代碼的。
這是QuartzHelper的代碼:
using Quartz; using Quartz.Impl; namespace Cong.Utility { public class QuartzHelper { /// <summary> /// 時間間隔執行任務 /// </summary> /// <typeparam name="T">任務類,必須實現IJob接口</typeparam> /// <param name="seconds">時間間隔(單位:毫秒)</param> public static void ExecuteInterval<T>(int seconds) where T : IJob { ISchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = factory.GetScheduler(); //IJobDetail job = JobBuilder.Create<T>().WithIdentity("job1", "group1").Build(); IJobDetail job = JobBuilder.Create<T>().Build(); ITrigger trigger = TriggerBuilder.Create() .StartNow() .WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).RepeatForever()) .Build(); scheduler.ScheduleJob(job, trigger); scheduler.Start(); } /// <summary> /// 指定時間執行任務 /// </summary> /// <typeparam name="T">任務類,必須實現IJob接口</typeparam> /// <param name="cronExpression">cron表達式,即指定時間點的表達式</param> public static void ExecuteByCron<T>(string cronExpression) where T : IJob { ISchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = factory.GetScheduler(); IJobDetail job = JobBuilder.Create<T>().Build(); //DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2); //DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddYears(2), 3); ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() //.StartAt(startTime).EndAt(endTime) .WithCronSchedule(cronExpression) .Build(); scheduler.ScheduleJob(job, trigger); scheduler.Start(); //Thread.Sleep(TimeSpan.FromDays(2)); //scheduler.Shutdown(); } } #region 任務執行例 //public class MyJob : IJob //{ // public void Execute(IJobExecutionContext context) // { // Console.WriteLine("executed..." + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); // } //} #endregion }
大概的過程是這樣的:
通過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:小時,逗號分隔
如果需要更詳細的說明,可以百度。