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

