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); } }