C#實現(xiàn)Quartz任務調度的示例代碼
使用 Quartz.NET,你可以很容易地安排任務在應用程序啟動時運行,或者每天、每周、每月的特定時間運行,甚至可以基于更復雜的調度規(guī)則。
官網(wǎng):http://www.quartz-scheduler.net/
實現(xiàn)任務類
創(chuàng)建一個實現(xiàn)了 IJob 接口的類(MailJobTest),該接口包含一個 Execute 方法,該方法將在作業(yè)運行時調用。例如:
using Quartz; using System; using System.Threading.Tasks; using UploadLogiData.Util; namespace UploadLogiData { /// <summary> /// 郵件任務測試(每天三點固定時間檢測Logi數(shù)據(jù)并發(fā)送內部郵件) /// </summary> //對于耗時任務,需要上一次執(zhí)行完成后,才執(zhí)行下次任務,覆蓋之前設置的執(zhí)行周期 [DisallowConcurrentExecution] public class MailJobTest : IJob { public async Task Execute(IJobExecutionContext context) { try { DisplayListboxMsg("郵箱開始調度"); } catch (Exception ex) { UpUtil.LogWrite("ExceptionLog",$"定時器異常_{ex.StackTrace}"); } } } }
實現(xiàn)一個LogiDownloadJob任務類
using MechTE_480.DateTimeCategory; using Quartz; using System; using System.Threading.Tasks; using UploadLogiData.Util; namespace UploadLogiData.Quartzs { /// <summary> /// 監(jiān)聽啟動時間,執(zhí)行任務下載logi數(shù)據(jù) /// </summary> //對于耗時任務,需要上一次執(zhí)行完成后,才執(zhí)行下次任務,覆蓋之前設置的執(zhí)行周期 [DisallowConcurrentExecution] public class LogiDownloadJob : IJob { public async Task Execute(IJobExecutionContext context) { DisplayListboxMsg("啟動時間開始調度"); } } }
啟動調度
實例化并啟動調度程序,并調度要執(zhí)行的作業(yè):
IScheduler scheduler1; /// <summary> /// 執(zhí)行任務調度 /// </summary> /// <returns></returns> public async Task ExLogiQuartz() { DisplayListboxMsg("檢測任務啟動!"); //1、創(chuàng)建一個調度 var factory = new StdSchedulerFactory(); var scheduler = await factory.GetScheduler(); await scheduler.Start(); //2、創(chuàng)建一個任務 var job = JobBuilder.Create<LogiDownloadJob>() .WithIdentity("LogiJob","LogiGroup") .Build(); //3、創(chuàng)建一個觸發(fā)器 var trigger = TriggerBuilder.Create() .WithIdentity("LogiTrigger","LogiTriggerGroup") .WithCronSchedule("0/5 * * * * ?") //5秒執(zhí)行一次 .Build(); await scheduler.ScheduleJob(job,trigger); // 第二個任務 var job2 = JobBuilder.Create<MailJobTest>() .WithIdentity("MailJob","MailGroup") .Build(); //3、創(chuàng)建一個觸發(fā)器 var trigger2 = TriggerBuilder.Create() .WithIdentity("MailTrigger","MailTriggerGroup") .WithCronSchedule("0/5 * * * * ?") //5秒執(zhí)行一次 .Build(); await scheduler.ScheduleJob(job2,trigger2); scheduler1 = scheduler; // 對象賦值 }
為作業(yè)指定身份:
var job = JobBuilder.Create<SimpleJob>() .WithIdentity("LogiJob","LogiGroup") // // 作業(yè)名稱為 "LogiJob",組名為 "LogiGroup" .Build();
為觸發(fā)器指定身份:
ITrigger trigger = TriggerBuilder.Create() .WithIdentity("myTrigger", "myTriggerGroup") // 觸發(fā)器名稱為 "myTrigger",組名為 "myTriggerGroup" .StartNow() .WithSimpleSchedule(x => x.WithIntervalInHours(1).RepeatForever()) .Build();
創(chuàng)建第二個任務:
// 創(chuàng)建并調度第二個作業(yè) // 第二個任務 var job2 = JobBuilder.Create<MailJobTest>() .WithIdentity("MailJob","MailGroup") .Build(); //3、創(chuàng)建一個觸發(fā)器 var trigger2 = TriggerBuilder.Create() .WithIdentity("MailTrigger","MailTriggerGroup") .WithCronSchedule("0/5 * * * * ?") //5秒執(zhí)行一次 .Build(); await scheduler.ScheduleJob(job2,trigger2); // 可以繼續(xù)添加更多的作業(yè)和觸發(fā)器...
重要性
- 唯一性:確保每個作業(yè)和觸發(fā)器在調度器中具有唯一的標識,從而避免沖突。
- 組織性:通過組名,可以將相關的作業(yè)或觸發(fā)器組織在一起,便于管理。
- 靈活性:通過使用不同的組,可以輕松地啟用、禁用或刪除一組相關的作業(yè)或觸發(fā)器。
- 查詢和更新:有了明確的身份標識,可以更容易地查詢作業(yè)或觸發(fā)器的狀態(tài),或者對其進行更新。
取消任務調度
// 關閉 scheduler1.Shutdown().Wait();
//方法外部訪問調度器實例 IScheduler scheduler1; public async void ExQuartz() { DisplayListboxMsg("檢測任務啟動!"); //1、創(chuàng)建一個調度 var factory = new StdSchedulerFactory(); var scheduler = await factory.GetScheduler(); await scheduler.Start(); //2、創(chuàng)建一個任務 var job = JobBuilder.Create<SimpleJob>() .WithIdentity("job1","group1") .Build(); //3、創(chuàng)建一個觸發(fā)器 var trigger = TriggerBuilder.Create() .WithIdentity("trigger1","group1") .WithCronSchedule("0/2 * * * * ?") //5秒執(zhí)行一次 .Build(); await scheduler.ScheduleJob(job,trigger); scheduler1 = scheduler; // 對象賦值 }
把ExQuartz封裝到類里面
ExLogiQuartz
方法示例,同時考慮了scheduler
的存儲和訪問:
QuartzScheduler類中
using Quartz; using Quartz.Impl; using System.Threading.Tasks; namespace UploadLogiData.Quartzs { /// <summary> /// 封裝了ExLogiQuartz方法和對scheduler的訪問 /// </summary> public class QuartzScheduler { /// <summary> /// 方法外部訪問調度器實例 /// </summary> IScheduler logiScheduler; //先靜態(tài)定義一下主窗體 public static Form1 form; public async Task ExLogiQuartz() { form.DisplayListboxMsg("檢測任務啟動!"); // 創(chuàng)建一個調度器實例 var factory = new StdSchedulerFactory(); logiScheduler = await factory.GetScheduler(); await logiScheduler.Start(); // 創(chuàng)建一個任務:LogiDownloadJob,每5秒執(zhí)行一次 var job = JobBuilder.Create<LogiDownloadJob>() .WithIdentity("LogiJob","LogiGroup") .Build(); var trigger = TriggerBuilder.Create() .WithIdentity("LogiTrigger","LogiTriggerGroup") .WithCronSchedule("0/5 * * * * ?") // 5秒執(zhí)行一次 .Build(); await logiScheduler.ScheduleJob(job,trigger); // 創(chuàng)建第二個任務:MailJobTest,每天下午3點10分執(zhí)行一次 var job2 = JobBuilder.Create<MailJobTest>() .WithIdentity("MailJob","MailGroup") .Build(); var trigger2 = TriggerBuilder.Create() .WithIdentity("MailTrigger","MailTriggerGroup") .WithCronSchedule("0 10 15 * * ?") // 每天下午3點10分執(zhí)行一次 .Build(); await logiScheduler.ScheduleJob(job2,trigger2); // 如果需要在其他地方訪問scheduler,可以通過類屬性或方法獲取 } public IScheduler Scheduler => logiScheduler; } }
調用示例
// 使用示例 public class Program { public static async Task Main(string[] args) { var quartzScheduler = new QuartzScheduler(); await quartzScheduler.ExLogiQuartz(); // 如果需要在其他地方訪問scheduler,可以通過以下方式獲取 var scheduler = quartzScheduler.Scheduler; // 如調用關閉 quartzScheduler.Scheduler.Shutdown().Wait(); // 其他邏輯... } }
以上就是C#實現(xiàn)Quartz任務調度的示例代碼的詳細內容,更多關于C# Quartz任務調度的資料請關注腳本之家其它相關文章!
相關文章
C#實現(xiàn)Winform監(jiān)控文件夾變化以及監(jiān)控文件操作教程
在開發(fā)應用程序時,我們可能會因為場景的需要,要對文件系統(tǒng)中的文件或文件夾進行實時監(jiān)測,以便在文件內容改變、文件被創(chuàng)建、刪除或重命名時能夠及時做出反應,今天,我將為大家介紹完整的操作流程,讓你輕松實現(xiàn)監(jiān)控文件/文件夾變化的功能,需要的朋友可以參考下2024-12-12DevExpress之ChartControl實現(xiàn)柱狀圖演示實例
這篇文章主要介紹了DevExpress中ChartControl實現(xiàn)柱狀圖演示方法,實例展示了相關繪圖函數(shù)的具體用法,具有一定的實用價值,需要的朋友可以參考下2014-10-10