使用Quartz为C# ASP.NET WebAPI项目配置各种定时工作任务

1.引用NuGet包,根据项目的.Net Framework选择对应版本即可。本例项目是.Net Framework 4.5.2,选择的Quartz版本是3.0.7

2.项目下新建文件夹TimedTask,下新建SchedulerServer类和TimedCallInspectContentExtractJob类。

SchedulerServer类作为Quartz的服务管理类,TimedCallInspectContentExtractJob是具体一个job工作任务的实现类。

3.补充SchedulerServer内容

public class SchedulerServer
    {
        private ISchedulerFactory _schedulerFactory;
        private IScheduler _scheduler;

        public static SchedulerServer CreateInstance()
        {
            return new SchedulerServer();
        }

        public virtual async Task Initialize()
        {
            System.Diagnostics.Debug.WriteLine("开始设置定时执行任务");
            _schedulerFactory = new StdSchedulerFactory();
            _scheduler = await _schedulerFactory.GetScheduler();

            //指定具体的任务job
            var job = JobBuilder.Create<TimedCallInspectContentExtractJob>()
                .WithIdentity("timedCallInspectContentExtractJob", "group1").Build();

            //这个trigger是设置的时间间隔24小时在每天的2:10开始执行任务
            //var trigger = TriggerBuilder.Create().WithIdentity("timedCallInspectContentExtractTrigger", "group1").WithDailyTimeIntervalSchedule(x=>x.WithIntervalInHours(24).OnEveryDay().StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(int.Parse("2"),int.Parse("10"))))
            //    .Build();

            //这个trigger是设置的程序启动之后立即执行了一次触发动作,但是后续没有任何触发动作再执行【只执行一次】
            //var trigger1 = TriggerBuilder.Create().WithIdentity("timedCallInspectContentExtractTrigger",
            //    "group1").StartAt(DateTime.UtcNow).StartNow().Build();

            //这个trigger是设置的程序启动之后立即执行了一次触发动作,并以时间间隔为2分钟后开始尝试执行触发动作
            var trigger1 = TriggerBuilder.Create().WithIdentity("timedCallInspectContentExtractTrigger", "group1").StartAt(DateTime.UtcNow)
                .StartNow().WithSimpleSchedule(x => x.WithIntervalInMinutes(2).RepeatForever()).Build();

            System.Diagnostics.Debug.WriteLine("定时执行任务设置完成");
            await _scheduler.ScheduleJob(job, trigger1);
        }

        public virtual async Task Start()
        {
            await _scheduler.Start();
        }

        public virtual async Task Stop()
        {
            await _scheduler.Shutdown(true);
        }
    }

4.补充TimedCallInspectContentExtractJob内容

public class TimedCallInspectContentExtractJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            //编写你的异步代码
        }
    }

5.设置启动

public class WebApiApplication : System.Web.HttpApplication
    {
        private readonly SchedulerServer _schedulerServer = SchedulerServer.CreateInstance();
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);

            StartTimedTask();
        }

        private void StartTimedTask()
        {
            Task.Run(async () =>
            {
                try
                {
                    await _schedulerServer.Initialize();
                    await _schedulerServer.Start();
                    System.Diagnostics.Debug.WriteLine("后台开始尝试上传文件到api接口");
                }
                catch (Exception ex)
                {
                    if (_schedulerServer != null)
                    {
                        await _schedulerServer.Stop();
                        System.Diagnostics.Debug.WriteLine("后台尝试上传文件到api,操作失败,上传任务正在关闭");
                    }
                }
            });
        }
    }

原文地址:https://www.cnblogs.com/jeff151013/p/14701325.html