Quartz 计划任务
Quartz目前最新的版本是3.6.0
代码中,关于Cron表达式的定义,可以参考如下博客:
Hangfire 定时任务设置某个时间区间每隔一定时间触发的Cron表达式
博客中采用了两种方法来实现我们的计划任务。
JobService1中实现了一种最基本的操作。
JobService2中实现了计划任务的分组、命名、启动、暂停、以及恢复操作。
MyJob是我们需要执行的计划任务。
代码结构如下:

Quartz3.6.0版本引用如下:

执行效果如下:

Form1.cs代码如下:
using System;
using System.Windows.Forms;
namespace WindowsFormsApp
{
public partial class Form1 : Form
{
JobService2 job2 = new JobService2();
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 启动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
// 方法1:每秒一次
//JobService1.Start<MyJob>("*/1 * * * * ?");
// 方法2:每秒一次
job2.Start<MyJob>(this,"job1","group1", "*/1 * * * * ?");
}
/// <summary>
/// job2暂停
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
job2.Stop("job1", "group1");
}
/// <summary>
/// job2恢复
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
job2.Restore("job1", "group1");
}
/// <summary>
/// job2提示
/// </summary>
public void RefreshData()
{
BeginInvoke(new Action(() =>
{
numericUpDown1.Value = numericUpDown1.Value + 1;
}));
}
}
}
JobService1.cs代码如下:
using Quartz;
using Quartz.Impl;
namespace WindowsFormsApp
{
public class JobService1
{
/// <summary>
/// 指定时间执行任务
/// </summary>
/// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
/// <param name="cronExpression">cron表达式,即指定时间点的表达式</param>
public static async void Start<T>(string cronExpression) where T : IJob
{
ISchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = await factory.GetScheduler();
IJobDetail job = JobBuilder.Create<T>().Build();
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
.WithCronSchedule(cronExpression)
.StartNow()
.Build();
await scheduler.ScheduleJob(job, trigger);
await scheduler.Start();
}
}
}
JobService2.cs代码如下:
using Quartz;
using Quartz.Impl;
namespace WindowsFormsApp
{
public class JobService2
{
private IScheduler scheduler = null;
/// <summary>
/// 触发作业立即运行
/// </summary>
/// <typeparam name="T"></typeparam>
public async void Start<T>(object form,string name, string group, string cron) where T : IJob
{
ISchedulerFactory factory = new StdSchedulerFactory();
scheduler = await factory.GetScheduler();
IJobDetail job = JobBuilder.Create<T>().WithIdentity(name, group).Build();
// 把窗体传进去
job.JobDataMap.Put("form1", form);
// 触发作业立即运行,然后每1秒重复一次
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity(name, group)
.StartNow()
.WithCronSchedule(cron)
// 每1秒重复一次
//.WithSimpleSchedule(x => x
// .WithIntervalInSeconds(1)
// .RepeatForever())
.Build();
// 移除已有的任务
var triggerKey = new TriggerKey(name, group);
var jobKey = new JobKey(name, group);
if (await scheduler.CheckExists(jobKey))
{
await scheduler.PauseTrigger(triggerKey); // 停止触发器
await scheduler.UnscheduleJob(triggerKey);// 移除触发器
await scheduler.DeleteJob(jobKey); // 删除任务
}
// 重新加载任务
await scheduler.ScheduleJob(job, trigger);
await scheduler.Start();
}
/// <summary>
/// 暂停一个job
/// </summary>
/// <param name="name"></param>
/// <param name="group"></param>
public async void Stop(string name, string group)
{
var jobKey = new JobKey(name, group);
if (await scheduler.CheckExists(jobKey))
{
await scheduler.PauseJob(jobKey);
}
}
/// <summary>
/// 恢复一个job
/// </summary>
/// <param name="name"></param>
/// <param name="group"></param>
public async void Restore(string name, string group)
{
var jobKey = new JobKey(name, group);
if (await scheduler.CheckExists(jobKey))
{
await scheduler.ResumeJob(jobKey);
}
}
}
}
MyJob.cs代码如下:
using Quartz;
using System;
using System.Threading.Tasks;
namespace WindowsFormsApp
{
public class MyJob : IJob//必须实现这个接口
{
Task IJob.Execute(IJobExecutionContext context)
{
System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒"));
//把窗体传参进来 获得f1进行刷新
Form1 form = (Form1)context.JobDetail.JobDataMap.Get("form1");
if (form != null)
{
form.RefreshData();
}
return Task.CompletedTask;
}
}
}