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