C# 实现定时/循环任务

用C#实现定时/循环任务,需要使用到Quartz,在项目的NuGet包管理中可以找到并添加。一般还会伴随安装一个Log4Net,主要用它来记录在任务执行过程中遇到的问题。这边主要是讲实现定时/循环任务,就不再赘述。

要实现定时/循环任务,就需要用到C#的作业和触发器

作业:

1.作业创建:

JobBuilder.Create<TestJob>()  这里的<TestJob>就是你实现具体任务的类
1             IJobDetail job1 = JobBuilder.Create<TestJob>()
2              .WithIdentity(jobName, gropName) //为该job的jobName和gropName赋值,相当于给予一个身份(非必须)
3              .UsingJobData("key", "value")//为作业的具体任务传递参数,键值对(非必须)
4              .Build();//创建作业(必须)

2.作业的具体任务

这时候要创建一个类,继承IJob,并实现接口方法,此方法是触发器触发时调用的方法,所以在这里写你的任务。

using log4net;
using Quartz;
using System;using System.Threading.Tasks;

namespace BackgroundTask.job
{
    public class TestJob : IJob
    {
        private readonly ILog _log = LogManager.GetLogger(typeof(TestJob));//利用Log来记录在任务执行过程中遇到的问题
        public void Execute(IJobExecutionContext context)
        {
            JobDataMap dataMap = context.JobDetail.JobDataMap;
            string k = dataMap.GetString("key");//在这里获取到参数,有GetInt,GetXXX等等,满足参数的类型需求// 以下开始写你的任务代码,
            Console.WriteLine(“123321”);
        }
    }
}

触发器:

1.触发器的声明

现在的版本,触发器创建和设置需要采用异步方法。

            IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();     //从工厂中获取一个调度器实例化

2.触发器的设置

循环触发器设置:

            // 创建触发器
            ITrigger trigger1 = TriggerBuilder.Create()
                                        .WithIdentity(tiggerName, gropName) //为触发器的tiggerName和gropName赋值,相当与给予一个身份
                                        .StartNow()                        //现在开始
                                        .WithSimpleSchedule(x => x         
                                            .WithIntervalInSeconds(10)     //触发时间,10秒一次。
                                            .RepeatForever())              //不间断重复执行
                                        .Build();                          //最终创建


            await scheduler.ScheduleJob(job1, trigger1);      //把作业,触发器加入调度器。
            await scheduler.Start();

定时触发器设置:

            ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                 //.StartAt(startTime).EndAt(endTime)  //开始时间,结束时间
                                   .WithCronSchedule(cronExpression) //设置定时触发规则 cronExpression字符串就包含了规则
                                   .Build();  //最终创建

            await scheduler.ScheduleJob(job1, trigger);

            await scheduler.Start();

任务和触发器的关闭

还记得在创建作业和触发器时候给的那个身份吗?在关闭的时候可以指定关闭对象

            TriggerKey triggerKey = new TriggerKey(tiggerName, gropName);
            JobKey jobKey = new JobKey(jobName, gropName);
            if (scheduler != null)
            {
                scheduler.PauseTrigger(triggerKey);
                scheduler.UnscheduleJob(triggerKey);
                scheduler.DeleteJob(jobKey);
                scheduler.Shutdown();// 关闭
            }

自此,我们对实现定时/循环任务就有了个清晰的思路

1 新建一个控制台项目。

2 建一个类,在此类中创建作业和触发器。

3 再建一个类,此类继承IJob接口,实现Excute方法。此类作为作业的具体实行任务。

4 执行该项目。

附带知识点:

CronExpression 规则

原文地址:https://www.cnblogs.com/jbdxbl/p/10598853.html