C#实现Quartz任务调度的示例代码

 更新时间:2024年04月12日 08:47:18   作者:叫我少年  
使用 Quartz.NET,你可以很容易地安排任务在应用程序启动时运行,或者每天、每周、每月的特定时间运行,甚至可以基于更复杂的调度规则,本文给大家介绍了C#实现Quartz任务调度,需要的朋友可以参考下

使用 Quartz.NET,你可以很容易地安排任务在应用程序启动时运行,或者每天、每周、每月的特定时间运行,甚至可以基于更复杂的调度规则。

官网:http://www.quartz-scheduler.net/

实现任务类

创建一个实现了 IJob 接口的类(MailJobTest),该接口包含一个 Execute 方法,该方法将在作业运行时调用。例如:

using Quartz;
using System;
using System.Threading.Tasks;
using UploadLogiData.Util;

namespace UploadLogiData
{
    /// <summary>
    /// 邮件任务测试(每天三点固定时间检测Logi数据并发送内部邮件)
    /// </summary>
    //对于耗时任务,需要上一次执行完成后,才执行下次任务,覆盖之前设置的执行周期
    [DisallowConcurrentExecution]
    public class MailJobTest : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            try
            {
                DisplayListboxMsg("邮箱开始调度");

            } catch (Exception ex)
            {  
                UpUtil.LogWrite("ExceptionLog",$"定时器异常_{ex.StackTrace}");
            }
        }
    }
}

实现一个LogiDownloadJob任务类

using MechTE_480.DateTimeCategory;
using Quartz;
using System;
using System.Threading.Tasks;
using UploadLogiData.Util;

namespace UploadLogiData.Quartzs
{
    /// <summary>
    /// 监听启动时间,执行任务下载logi数据
    /// </summary>
    //对于耗时任务,需要上一次执行完成后,才执行下次任务,覆盖之前设置的执行周期
    [DisallowConcurrentExecution]
    public class LogiDownloadJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            DisplayListboxMsg("启动时间开始调度");
        }
    }
}

启动调度

实例化并启动调度程序,并调度要执行的作业:

IScheduler scheduler1;
/// <summary>
/// 执行任务调度
/// </summary>
/// <returns></returns>
public async Task ExLogiQuartz()
{
    DisplayListboxMsg("检测任务启动!");
    //1、创建一个调度
    var factory = new StdSchedulerFactory();
    var scheduler = await factory.GetScheduler();
    await scheduler.Start();

    //2、创建一个任务
    var job = JobBuilder.Create<LogiDownloadJob>()
        .WithIdentity("LogiJob","LogiGroup")
        .Build();
    //3、创建一个触发器
    var trigger = TriggerBuilder.Create()
        .WithIdentity("LogiTrigger","LogiTriggerGroup")
        .WithCronSchedule("0/5 * * * * ?")     //5秒执行一次
        .Build();
    await scheduler.ScheduleJob(job,trigger);

    // 第二个任务
    var job2 = JobBuilder.Create<MailJobTest>()
       .WithIdentity("MailJob","MailGroup")
       .Build();
    //3、创建一个触发器
    var trigger2 = TriggerBuilder.Create()
        .WithIdentity("MailTrigger","MailTriggerGroup")
        .WithCronSchedule("0/5 * * * * ?")     //5秒执行一次
        .Build();
    await scheduler.ScheduleJob(job2,trigger2);

    scheduler1 = scheduler; // 对象赋值
}

为作业指定身份:

var job = JobBuilder.Create<SimpleJob>()
        .WithIdentity("LogiJob","LogiGroup") // // 作业名称为 "LogiJob",组名为 "LogiGroup"  
        .Build();

为触发器指定身份:

ITrigger trigger = TriggerBuilder.Create()  
    .WithIdentity("myTrigger", "myTriggerGroup") // 触发器名称为 "myTrigger",组名为 "myTriggerGroup"  
    .StartNow()  
    .WithSimpleSchedule(x => x.WithIntervalInHours(1).RepeatForever())  
    .Build();

创建第二个任务:

 // 创建并调度第二个作业  
 // 第二个任务
 var job2 = JobBuilder.Create<MailJobTest>()
    .WithIdentity("MailJob","MailGroup")
    .Build();
 //3、创建一个触发器
 var trigger2 = TriggerBuilder.Create()
     .WithIdentity("MailTrigger","MailTriggerGroup")
     .WithCronSchedule("0/5 * * * * ?")     //5秒执行一次
     .Build();
 await scheduler.ScheduleJob(job2,trigger2);
  
    // 可以继续添加更多的作业和触发器...  

重要性

  • 唯一性:确保每个作业和触发器在调度器中具有唯一的标识,从而避免冲突。
  • 组织性:通过组名,可以将相关的作业或触发器组织在一起,便于管理。
  • 灵活性:通过使用不同的组,可以轻松地启用、禁用或删除一组相关的作业或触发器。
  • 查询和更新:有了明确的身份标识,可以更容易地查询作业或触发器的状态,或者对其进行更新。

取消任务调度

// 关闭
scheduler1.Shutdown().Wait();
 //方法外部访问调度器实例
IScheduler scheduler1;
 public async void ExQuartz()
 {
     DisplayListboxMsg("检测任务启动!");
     //1、创建一个调度
     var factory = new StdSchedulerFactory();
     var scheduler = await factory.GetScheduler();
     await scheduler.Start();
     //2、创建一个任务
     var job = JobBuilder.Create<SimpleJob>()
         .WithIdentity("job1","group1")
         .Build();
     //3、创建一个触发器
     var trigger = TriggerBuilder.Create()
         .WithIdentity("trigger1","group1")
         .WithCronSchedule("0/2 * * * * ?")     //5秒执行一次
         .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;

        //先静态定义一下主窗体
        public static Form1 form;

        public async Task ExLogiQuartz()
        {
            form.DisplayListboxMsg("检测任务启动!");
            // 创建一个调度器实例  
            var factory = new StdSchedulerFactory();
            logiScheduler = await factory.GetScheduler();
            await logiScheduler.Start();

            // 创建一个任务:LogiDownloadJob,每5秒执行一次  
            var job = JobBuilder.Create<LogiDownloadJob>()
                .WithIdentity("LogiJob","LogiGroup")
                .Build();
            var trigger = TriggerBuilder.Create()
                .WithIdentity("LogiTrigger","LogiTriggerGroup")
                .WithCronSchedule("0/5 * * * * ?") // 5秒执行一次  
                .Build();
            await logiScheduler.ScheduleJob(job,trigger);

            // 创建第二个任务:MailJobTest,每天下午3点10分执行一次  
            var job2 = JobBuilder.Create<MailJobTest>()
                .WithIdentity("MailJob","MailGroup")
                .Build();
            var trigger2 = TriggerBuilder.Create()
                .WithIdentity("MailTrigger","MailTriggerGroup")
                .WithCronSchedule("0 10 15 * * ?") // 每天下午3点10分执行一次  
                .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#实现Quartz任务调度的示例代码的详细内容,更多关于C# Quartz任务调度的资料请关注脚本之家其它相关文章!

相关文章

  • C# XmlDocument操作XML案例详解

    C# XmlDocument操作XML案例详解

    这篇文章主要介绍了C# XmlDocument操作XML案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C#简单实现文件上传功能

    C#简单实现文件上传功能

    这篇文章主要介绍了C#简单实现文件上传功能,利用MVC+EF+LigerUI 实现的upload上传功能,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • C#实现设置Excel表格中文本对齐方式和格式

    C#实现设置Excel表格中文本对齐方式和格式

    这篇文章主要为大家详细介绍了如何在.NET 程序中通过C# 设置Excel单元格中文本的对齐方式,方向以及换行,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-04-04
  • Winform控件优化之圆角按钮2

    Winform控件优化之圆角按钮2

    这篇文章主要介绍了Winform控件优化之圆角按钮2,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-08-08
  • C# 使用PrintDocument类打印标签的方法

    C# 使用PrintDocument类打印标签的方法

    本文介绍打印机初步配置,以及实现方法,标签主要展示资产基本信息以及二维码,对C# 使用PrintDocument类打印标签的详细过程感兴趣的朋友一起看看吧
    2022-04-04
  • C#实现Winform监控文件夹变化以及监控文件操作教程

    C#实现Winform监控文件夹变化以及监控文件操作教程

    在开发应用程序时,我们可能会因为场景的需要,要对文件系统中的文件或文件夹进行实时监测,以便在文件内容改变、文件被创建、删除或重命名时能够及时做出反应,今天,我将为大家介绍完整的操作流程,让你轻松实现监控文件/文件夹变化的功能,需要的朋友可以参考下
    2024-12-12
  • C# FileStream复制大文件功能

    C# FileStream复制大文件功能

    这篇文章主要为大家详细介绍了C# FileStream复制大文件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • C#学习笔记整理_浅谈Math类的方法

    C#学习笔记整理_浅谈Math类的方法

    下面小编就为大家带来一篇C#学习笔记整理_浅谈Math类的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • DevExpress之ChartControl实现柱状图演示实例

    DevExpress之ChartControl实现柱状图演示实例

    这篇文章主要介绍了DevExpress中ChartControl实现柱状图演示方法,实例展示了相关绘图函数的具体用法,具有一定的实用价值,需要的朋友可以参考下
    2014-10-10
  • C#实现的WINDOWS登录功能示例

    C#实现的WINDOWS登录功能示例

    这篇文章主要介绍了C#实现的WINDOWS登录功能,结合实例形式分析了简单的Windows图形化登陆功能实现技巧,需要的朋友可以参考下
    2017-08-08

最新评论