C#實現(xiàn)Quartz任務(wù)調(diào)度的示例代碼
使用 Quartz.NET,你可以很容易地安排任務(wù)在應(yīng)用程序啟動時運行,或者每天、每周、每月的特定時間運行,甚至可以基于更復(fù)雜的調(diào)度規(guī)則。
官網(wǎng):http://www.quartz-scheduler.net/
實現(xiàn)任務(wù)類
創(chuàng)建一個實現(xiàn)了 IJob 接口的類(MailJobTest),該接口包含一個 Execute 方法,該方法將在作業(yè)運行時調(diào)用。例如:
using Quartz; using System; using System.Threading.Tasks; using UploadLogiData.Util; namespace UploadLogiData { /// <summary> /// 郵件任務(wù)測試(每天三點固定時間檢測Logi數(shù)據(jù)并發(fā)送內(nèi)部郵件) /// </summary> //對于耗時任務(wù),需要上一次執(zhí)行完成后,才執(zhí)行下次任務(wù),覆蓋之前設(shè)置的執(zhí)行周期 [DisallowConcurrentExecution] public class MailJobTest : IJob { public async Task Execute(IJobExecutionContext context) { try { DisplayListboxMsg("郵箱開始調(diào)度"); } catch (Exception ex) { UpUtil.LogWrite("ExceptionLog",$"定時器異常_{ex.StackTrace}"); } } } }
實現(xiàn)一個LogiDownloadJob任務(wù)類
using MechTE_480.DateTimeCategory; using Quartz; using System; using System.Threading.Tasks; using UploadLogiData.Util; namespace UploadLogiData.Quartzs { /// <summary> /// 監(jiān)聽啟動時間,執(zhí)行任務(wù)下載logi數(shù)據(jù) /// </summary> //對于耗時任務(wù),需要上一次執(zhí)行完成后,才執(zhí)行下次任務(wù),覆蓋之前設(shè)置的執(zhí)行周期 [DisallowConcurrentExecution] public class LogiDownloadJob : IJob { public async Task Execute(IJobExecutionContext context) { DisplayListboxMsg("啟動時間開始調(diào)度"); } } }
啟動調(diào)度
實例化并啟動調(diào)度程序,并調(diào)度要執(zhí)行的作業(yè):
IScheduler scheduler1; /// <summary> /// 執(zhí)行任務(wù)調(diào)度 /// </summary> /// <returns></returns> public async Task ExLogiQuartz() { DisplayListboxMsg("檢測任務(wù)啟動!"); //1、創(chuàng)建一個調(diào)度 var factory = new StdSchedulerFactory(); var scheduler = await factory.GetScheduler(); await scheduler.Start(); //2、創(chuàng)建一個任務(wù) 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); // 第二個任務(wù) 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)建第二個任務(wù):
// 創(chuàng)建并調(diào)度第二個作業(yè) // 第二個任務(wù) 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ā)器在調(diào)度器中具有唯一的標(biāo)識,從而避免沖突。
- 組織性:通過組名,可以將相關(guān)的作業(yè)或觸發(fā)器組織在一起,便于管理。
- 靈活性:通過使用不同的組,可以輕松地啟用、禁用或刪除一組相關(guān)的作業(yè)或觸發(fā)器。
- 查詢和更新:有了明確的身份標(biāo)識,可以更容易地查詢作業(yè)或觸發(fā)器的狀態(tài),或者對其進(jìn)行更新。
取消任務(wù)調(diào)度
// 關(guān)閉 scheduler1.Shutdown().Wait();
//方法外部訪問調(diào)度器實例 IScheduler scheduler1; public async void ExQuartz() { DisplayListboxMsg("檢測任務(wù)啟動!"); //1、創(chuàng)建一個調(diào)度 var factory = new StdSchedulerFactory(); var scheduler = await factory.GetScheduler(); await scheduler.Start(); //2、創(chuàng)建一個任務(wù) 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> /// 方法外部訪問調(diào)度器實例 /// </summary> IScheduler logiScheduler; //先靜態(tài)定義一下主窗體 public static Form1 form; public async Task ExLogiQuartz() { form.DisplayListboxMsg("檢測任務(wù)啟動!"); // 創(chuàng)建一個調(diào)度器實例 var factory = new StdSchedulerFactory(); logiScheduler = await factory.GetScheduler(); await logiScheduler.Start(); // 創(chuàng)建一個任務(wù):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)建第二個任務(wù):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; } }
調(diào)用示例
// 使用示例 public class Program { public static async Task Main(string[] args) { var quartzScheduler = new QuartzScheduler(); await quartzScheduler.ExLogiQuartz(); // 如果需要在其他地方訪問scheduler,可以通過以下方式獲取 var scheduler = quartzScheduler.Scheduler; // 如調(diào)用關(guān)閉 quartzScheduler.Scheduler.Shutdown().Wait(); // 其他邏輯... } }
以上就是C#實現(xiàn)Quartz任務(wù)調(diào)度的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C# Quartz任務(wù)調(diào)度的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#實現(xiàn)設(shè)置Excel表格中文本對齊方式和格式
這篇文章主要為大家詳細(xì)介紹了如何在.NET 程序中通過C# 設(shè)置Excel單元格中文本的對齊方式,方向以及換行,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04C#?使用PrintDocument類打印標(biāo)簽的方法
本文介紹打印機初步配置,以及實現(xiàn)方法,標(biāo)簽主要展示資產(chǎn)基本信息以及二維碼,對C#?使用PrintDocument類打印標(biāo)簽的詳細(xì)過程感興趣的朋友一起看看吧2022-04-04C#實現(xiàn)Winform監(jiān)控文件夾變化以及監(jiān)控文件操作教程
在開發(fā)應(yīng)用程序時,我們可能會因為場景的需要,要對文件系統(tǒng)中的文件或文件夾進(jìn)行實時監(jiān)測,以便在文件內(nèi)容改變、文件被創(chuàng)建、刪除或重命名時能夠及時做出反應(yīng),今天,我將為大家介紹完整的操作流程,讓你輕松實現(xiàn)監(jiān)控文件/文件夾變化的功能,需要的朋友可以參考下2024-12-12DevExpress之ChartControl實現(xiàn)柱狀圖演示實例
這篇文章主要介紹了DevExpress中ChartControl實現(xiàn)柱狀圖演示方法,實例展示了相關(guān)繪圖函數(shù)的具體用法,具有一定的實用價值,需要的朋友可以參考下2014-10-10