如果我平时需要每个月对用户积分的清零,又或者是超过未付款时间商品的库存恢复等等定时计划任务,
一般都会使用Window service服务定时的来进行调我项目的某个接口来进行对应的业务处理。

不过对于Window service服务,除了不好调试外,还有就是局限性比较大,
一方面Window service服务是独立于自身项目,不能直接调用项目的业务方法,需要以调用请求接口的形式进行处理,并且每次需要独立部署安装服务,第二个就是如果一个项目有多个计划任务的话,也会比较麻烦。

Quartz.NET是一个强大、开源、轻量的作业调度框架,可用于winform和asp.net应用中。它灵活而不复杂。你能够用它来为执行一个作业而创建简单的或复杂的作业调度。它有很多特征,如:数据库支持,集群,插件,支持cron表达式等等


那我们现在来写个Demo

一.打开vs,创建一个ASP.Net MVC5项目,在NuGet中安装最新版本的 Quartz(截止到这篇文章,版本为3.0.6)

二.新建一个 MyJob 任务类,用来执行自己需要的计划任务

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using System.Web;

namespace TimedTask
{
    public class MyJob : IJob
    {
        public static int num = 0;
        public Task Execute(IJobExecutionContext context)//必须实现IJob接口下的Execute方法
        {
            num++;
            Debug.WriteLine("任务执行 "+num+" 次");
            return Task.CompletedTask;
        }
    }
}

三.新建一个 MyScheduler 调度类,用来设置调度时间和要执行的任务

using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Threading.Tasks;
using System.Web;

namespace TimedTask
{
    public class MyScheduler
    {
        public static async Task Start()
        {
            ISchedulerFactory factory = new StdSchedulerFactory();

            IScheduler scheduler = await factory.GetScheduler(); //从工厂中获取一个调度器实例化
            await scheduler.Start();   //开始调度器

            IJobDetail job = JobBuilder.Create< MyJob >().Build();//创建一个作业

            //方式一,较为简单的可设置每隔多少秒,多少分钟,小时,天等时间来定时执行任务
            //ITrigger trigger = TriggerBuilder.Create()
            //    .WithSimpleSchedule(t =>
            //    t.WithIntervalInSeconds(5) //触发执行,5s一次
            //    .RepeatForever())          //重复执行
            //    .Build();
 
            //方式二,利用Cron表达式来进行更为复杂的时间调度定时
            ITrigger trigger =TriggerBuilder.Create() 
                .WithCronSchedule("0 0/3 17-23 * * ?")//Cron表达式,每天的17-23点之间每三分钟执行一次
                .Build();

            await scheduler.ScheduleJob(job, trigger); //把作业,触发器加入调度器。 
        }
    }
}

四.将调度类的开始方法配置在全局 Global.asax 中

 public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            MyScheduler.Start();//任务启动
        }
    }

启动项目自动打开页面后会自动触发Application_Start()方法,任务也就开始执行


Tip:

关于Cron表达式相关资料可点击这里查看

最后提供一下官方的开源代码以及示例用于参考及学习:https://github.com/quartznet/quartznet/releases