自定义定时任务

1.首先新建一个项目,我建的是.net core的项目

2.右键单击项目下面的依赖项->管理nuget包->浏览然后搜索Quartz然后选择后面的安装(我安装的是3.0.4版本)在弹出来的接受许可证中选择我接受,然后依赖项下面的nuget就会如下所示


3.在homecontroller里面添加一个启动任务的方法(如下所示)

        private static async Task RunProgramRunExample(int i, AppLibrary appLibrary)
        {
            try
            {
                IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();
                if (i == 1)
                {     //启动
                    CronScheduleBuilder builder = CronScheduleBuilder.CronSchedule(appLibrary.Bds);//appLibrary.Bds代表的是cron表达式
                    ITrigger trigger = TriggerBuilder.Create()
                        .WithIdentity("trigger" + appLibrary.Id, "group1" + appLibrary.Id)//如此可同时启动多个类
                        .StartNow()
                        .WithSchedule(builder)
                        .Build();
                    Type type = Type.GetType(appLibrary.Namespace);
                    IJobDetail job = JobBuilder.Create(type)
                        .WithIdentity("job1" + appLibrary.Id, "group1" + appLibrary.Id)//同上
                        .Build();
                    //加入这个调度
                    await scheduler.ScheduleJob(job, trigger);

                    //启动任务
                    await scheduler.Start();
                }
                else
                {   //停止任务
                    await scheduler.Shutdown(true);
                }
            }
            catch (SchedulerException se)
            {
                Console.WriteLine(se);
            }
        }

并添加以下引用

using Quartz;
using Quartz.Impl;

AppLibrary类是我自定义的一个类,里面的Namespace字段记录的是命名空间+类名,如此可自定义启动某个类。

3.添加以下方法可手动开启启动或停止任务

//启动任务
        public IActionResult start(int id)
        {
            AppLibrary appLibrary = _context.AppLibrarys.SingleOrDefault(m => m.ID == id);

            RunProgramRunExample(1, appLibrary).GetAwaiter().GetResult();
            if (appLibrary.State != 2)//appLibrary.State代表的是启动状态为2时表示已经开启启动任务,为1是表示未开启启动任务
            {
                appLibrary.State = 2;//将状态改为已启动
                _context.AppLibrarys.Update(appLibrary);
                _context.SaveChangesAsync();
            }
            return RedirectToAction(nameof(Index));
        }
        //停止启动
        public IActionResult stop(int id)
        {
            AppLibrary appLibrary = _context.AppLibrarys.SingleOrDefault(m => m.ID == id);
            RunProgramRunExample(2, appLibrary).GetAwaiter().GetResult();
            appLibrary.State = 1;
            _context.AppLibrarys.Update(appLibrary);
            _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }

然后在index里面添加以下代码则可以在项目启动时自动开启所有定时任务

List<AppLibrary> alist = _context.AppLibrary.ToList();
            //启动所有状态为已启动的任务
            foreach (var item in alist)
            {
                if (item.State == 2)
                {
                    start(item.Id);
                }
            }



猜你喜欢

转载自blog.csdn.net/zhouxueli32/article/details/80415075