zoukankan      html  css  js  c++  java
  • C# Quartz.Net 定时任务的简单使用

    最近做了一个定时执行任务的软件。

    执行任务时,会使用log4net记录日志,如果执行任务有异常,则发送邮件给指定的对象。

    我做的是每天的9点和16点执行一次任务,以此记录:

     

    首先,获得Quartz.Net,

    其实可以使用vs2015的Nuget管理器,下载。

     

    我做了一个QuartzHelper,但是在主程序中,还是需要其他代码的。

    这是QuartzHelper的代码:

     1 using Quartz;
     2 using Quartz.Impl;
     3 
     4 namespace Cong.Utility
     5 {
     6     public class QuartzHelper
     7     {
     8         /// <summary>
     9         /// 时间间隔执行任务
    10         /// </summary>
    11         /// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
    12         /// <param name="seconds">时间间隔(单位:毫秒)</param>
    13         public static void ExecuteInterval<T>(int seconds) where T : IJob
    14         {
    15             ISchedulerFactory factory = new StdSchedulerFactory();
    16             IScheduler scheduler = factory.GetScheduler();
    17 
    18             //IJobDetail job = JobBuilder.Create<T>().WithIdentity("job1", "group1").Build();
    19             IJobDetail job = JobBuilder.Create<T>().Build();
    20 
    21             ITrigger trigger = TriggerBuilder.Create()
    22                 .StartNow()
    23                 .WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).RepeatForever())
    24                 .Build();
    25 
    26             scheduler.ScheduleJob(job, trigger);
    27 
    28             scheduler.Start();
    29         }
    30 
    31         /// <summary>
    32         /// 指定时间执行任务
    33         /// </summary>
    34         /// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
    35         /// <param name="cronExpression">cron表达式,即指定时间点的表达式</param>
    36         public static void ExecuteByCron<T>(string cronExpression) where T : IJob
    37         {
    38             ISchedulerFactory factory = new StdSchedulerFactory();
    39             IScheduler scheduler = factory.GetScheduler();
    40 
    41             IJobDetail job = JobBuilder.Create<T>().Build();
    42 
    43             //DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
    44             //DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddYears(2), 3);
    45 
    46             ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
    47                 //.StartAt(startTime).EndAt(endTime)
    48                 .WithCronSchedule(cronExpression)
    49                 .Build();
    50 
    51             scheduler.ScheduleJob(job, trigger);
    52 
    53             scheduler.Start();
    54 
    55             //Thread.Sleep(TimeSpan.FromDays(2));
    56             //scheduler.Shutdown();
    57         }
    58     }
    59 
    60     #region 任务执行例
    61     //public class MyJob : IJob
    62     //{
    63     //    public void Execute(IJobExecutionContext context)
    64     //    {
    65     //        Console.WriteLine("executed..." + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
    66     //    }
    67     //} 
    68     #endregion
    69 }

    大概的过程是这样的:
    通过ISchedulerFactory实例化一个计划工厂对象,并使用工厂实例化一个scheduler计划对象,

    然后实例化一个任务对象job,也就是定义任务内容的对象,需要传入一个实现IJob接口的类,这里我使用了泛型,

    接着,需要一个能触发任务的对象,这里有两种,

    一种是ITrigger,这是用于规格时间间隔,计划开始后,会根据间隔的时间值,触发执行任务;

    另一种是ICronTrigger,这是通过Cron表达式规格执行的时间,计划开始后,如果时间符合规定时间,就触发执行任务。

    最后,把job和trigger都传入计划scheduler,计划开始。

     

    最下方的任务执行例是一个例子,

    必须实现IJob接口和Execute方法。

     

    如果需要在Execute方法内,调用类外部的数据,我是通过在项目中定义静态类的方法,供MyJob调用的。

     

    程序开始计划的代码:

    string cronExpression = "0 0 9,16 * * ? ";  =>这是指每天的9点和16点执行任务
    QuartzHelper.ExecuteByCron<MyJob>(cronExpression);  =>这是调用Cron计划方法

     

    简单说一下Cron表达式吧,

    "0 0 9,16 * * ? ",

    顺序从左到右

    0:秒

    0:分

    9,16:小时,逗号分隔

    如果需要更详细的说明,可以百度。

  • 相关阅读:
    【黑金动力社区】【原创博文集锦】《Verilog HDL那些事儿》导读
    [黑金原创教程][连载]关于《iBoard 电子学堂》的学习及进阶方式
    发布《iBoard 电子学堂》DEMO代码
    Cyclone III中LVDS的设计
    [黑金原创教程][连载][iBoard 电子学堂][第八卷 设计任意波发生器]第三篇 直接数字合成(DDS)原理
    专业级FPGA视频图像处理开发板发布
    [黑金原创教程][连载][iBoard 电子学堂][第〇卷 电子基础]第二篇 电路图与印刷电路板
    [黑金原创教程][连载][iBoard 电子学堂][第八卷 设计任意波发生器]第一篇 iBoard 任意波发生器简介
    [黑金原创教程][连载][iBoard 电子学堂][第〇卷 电子基础]第一篇 认识电子元器件
    ucgui 在《iBoard 电子学堂》上的移植
  • 原文地址:https://www.cnblogs.com/chenyucong/p/6264739.html
Copyright © 2011-2022 走看看