最近因為項目需要用到了Quartz,下面簡單記錄一下。
一、首先需要安裝Quartz。

二、定義一個執行的Job類,實現IJob接口,接口有一個方法Execute,用來執行定時任務的實現內容。
public class HelloJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
Console.WriteLine("作業執行!");
}
}
三、定時觸發,根據設定的時間間隔觸發。
//從工廠中獲取一個調度器實例化
IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();
await scheduler.Start(); //開啟調度器
//==========例子1(簡單使用)===========
IJobDetail job1 = JobBuilder.Create<HelloJob>() //創建一個作業
.WithIdentity("job", "group1")
.Build();
ITrigger trigger1 = TriggerBuilder.Create()
.WithIdentity("trigger", "group1")
.StartNow() //現在開始
.WithSimpleSchedule(x => x //觸發時間,5秒一次。
.WithIntervalInSeconds(5)
.RepeatForever()) //不間斷重復執行
.Build();
await scheduler.ScheduleJob(job1, trigger1); //把作業,觸發器加入調度器。
四、僅觸發一次,定時器在設定時間內,只觸發一次。
IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();
IJobDetail job = JobBuilder.Create<HelloJob>() //創建一個作業
.WithIdentity("job3", "group3")
.Build();
ITrigger trigger = trigger = (ISimpleTrigger)TriggerBuilder.Create()
.WithIdentity("trigger3", "group3")
.StartAt(DateBuilder.FutureDate(1, IntervalUnit.Second)) //使用DateBuilder將來創建一個時間日期
.ForJob(job) //通過JobKey識別作業
.Build();
await scheduler.ScheduleJob(job,trigger);
await scheduler.Start();
五、移除定時任務
調用公共方法,實現定時任務移除
JobKey JKey = new JobKey("job", "group1"); TriggerKey TKey = new TriggerKey("trigger", "group1"); await QuartzHelper.RemoveJob(JKey, TKey);
封裝了一個定時器的公共類,方便程序復用。
public static class QuartzHelper { public static async Task RemoveJob(JobKey jobKey, TriggerKey triggerKey) { try { var scheduler = await TaskDeadLineEndJob.GetSchedulerAsync(); var state = await scheduler.GetTriggerState(triggerKey); if (state == TriggerState.None) { return; } await scheduler.PauseTrigger(triggerKey);// 停止觸發器 await scheduler.UnscheduleJob(triggerKey);// 移除觸發器 await scheduler.DeleteJob(jobKey);// 刪除任務 } catch (Exception) { throw; } } }
定義一個工廠類,用來保證定時任務是唯一的,如果每次都new一個新實例,后面可能會出問題。
public class TaskDeadLineEndJob { private static IScheduler scheduler; private static Task<IScheduler> TaskScheduler; private static readonly object padlock = new object(); public static async Task<IScheduler> GetSchedulerAsync() { lock (padlock) { // 如果類的實例不存在則創建,否則直接返回 if (scheduler == null) { ISchedulerFactory schedf = new StdSchedulerFactory(); TaskScheduler = schedf.GetScheduler(); } else { return scheduler; } } return await TaskScheduler; } public TaskDeadLineEndJob() { try { Task.Run(async () => { // 開啟調度器 scheduler = await GetSchedulerAsync(); await scheduler.Start(); }); } catch (Exception) { throw; } } }
