Quartz 是个开源的作业调度框架.

安装:Install-Package Quartz

官网文档地址:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/using-quartz.html

资源比较多,这里不做介绍。

任务设置有两种方式:SimpleTrigger和CronTrigger,如下:

var trigger = (ISimpleTrigger) TriggerBuilder.Create()
    .WithIdentity("trigger1", "group1")
    .StartAt(myStartTime) // some Date
    .ForJob("job1", "group1") // identify job with name, group strings

var trigger = TriggerBuilder.Create()

.WithIdentity("trigger3", "group1")
    .WithCronSchedule("0 0/2 8-17 * * ?")
    .ForJob("myJob", "group1")
    .Build();

第二种的在线表达式生成工具网址:http://cron.qqe2.com/

在这里写个控制台的Demo来看看定时任务的效果,我们先简单的封装一下任务的启动和停止等,主要代码如下:

  public class QuartzHelper
{
private static QuartzHelper instance = new QuartzHelper(); public static QuartzHelper Instance
{
get
{
if (instance == null)
{
instance = new QuartzHelper();
}
return instance;
}
} private const string JOB_GROUP_NAME = "JOB_GROUP_NAME";
private const string TRIGGER_GROUP_NAME = "TRIGGER_GROUP_NAME"; /// <summary>
/// 程序调度
/// </summary>
private static IScheduler _scheduler; /// <summary>
/// 初始化任务调度对象
/// </summary>
private QuartzHelper()
{ } /// <summary>
/// 时间间隔执行任务
/// </summary>
/// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
/// <param name="seconds">时间间隔(单位:毫秒)</param>
public async Task StartJobExecuteInterval<T>(int seconds, string jobName = null, string jobGroupName = null, string triggerName = null, string triggerGroupName = null) where T : IJob
{
await InitJobs(); //IJobDetail job = JobBuilder.Create<T>().WithIdentity("job1", "group1").Build();
IJobDetail job = JobBuilder.Create<T>().Build(); ITrigger trigger = TriggerBuilder.Create()
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).RepeatForever())
.Build(); await _scheduler.ScheduleJob(job, trigger); await _scheduler.Start();
} /// <summary>
/// 指定时间执行任务
/// </summary>
/// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
/// <param name="cronExpression">cron表达式,即指定时间点的表达式</param>
public async Task<TriggerState> StartJobExecuteByCron<T>(string cronExpression, string jobName, object para = null, DateTime? startTime = null, DateTime? endTime = null, string jobGroupName = JOB_GROUP_NAME, string triggerName = null, string triggerGroupName = TRIGGER_GROUP_NAME) where T : IJob
{
await InitJobs(); IJobDetail job = JobBuilder.Create<T>()
.WithIdentity(jobName, jobGroupName)
.Build();
job.JobDataMap.Put("Runner", para); ITrigger trigger;
if (startTime == null && endTime == null)
{
trigger = TriggerBuilder.Create()
.WithIdentity(triggerName ?? jobName, triggerGroupName)
.WithCronSchedule(cronExpression)
.Build();
}
else if (startTime != null && endTime == null)
{
trigger = TriggerBuilder.Create()
.WithIdentity(triggerName ?? jobName, triggerGroupName)
.StartAt(CronHelper.DateTime2DateTimeOffset(startTime.Value))
.WithCronSchedule(cronExpression)
.Build();
}
else if (startTime == null && endTime != null)
{
trigger = TriggerBuilder.Create()
.WithIdentity(triggerName ?? jobName, triggerGroupName)
.EndAt(CronHelper.DateTime2DateTimeOffset(endTime.Value))
.WithCronSchedule(cronExpression)
.Build();
}
else
{
trigger = TriggerBuilder.Create()
.WithIdentity(triggerName ?? jobName, triggerGroupName)
.StartAt(CronHelper.DateTime2DateTimeOffset(startTime.Value))
.EndAt(CronHelper.DateTime2DateTimeOffset(endTime.Value))
.WithCronSchedule(cronExpression)
.Build();
} await _scheduler.ScheduleJob(job, trigger); await _scheduler.Start(); return await _scheduler.GetTriggerState(trigger.Key);
} public async Task<TriggerState> ModifyJobTime(string cronExpression, string jobName, string jobGroupName = JOB_GROUP_NAME, string triggerName = null, string triggerGroupName = TRIGGER_GROUP_NAME)
{
IJobDetail job;
ITrigger trigger; job = await _scheduler.GetJobDetail(new JobKey(jobName, jobGroupName));
trigger = await _scheduler.GetTrigger(new TriggerKey(triggerName ?? jobName, triggerGroupName));
if (job == null || trigger == null)
{
return TriggerState.None;
} await _scheduler.UnscheduleJob(trigger.Key); trigger = TriggerBuilder.Create()
.WithIdentity(trigger.Key.Name, trigger.Key.Group)
.WithCronSchedule(cronExpression)
.Build(); await _scheduler.ScheduleJob(job, trigger); return await _scheduler.GetTriggerState(trigger.Key);
} public async Task<TriggerState> RemoveJob(string jobName, string jobGroupName = JOB_GROUP_NAME, string triggerName = null, string triggerGroupName = TRIGGER_GROUP_NAME)
{ IJobDetail job;
ITrigger trigger; job = await _scheduler.GetJobDetail(new JobKey(jobName, jobGroupName));
trigger = await _scheduler.GetTrigger(new TriggerKey(triggerName ?? jobName, triggerGroupName));
if (job == null || trigger == null)
{
return TriggerState.None;
} await _scheduler.UnscheduleJob(trigger.Key);
await _scheduler.DeleteJob(job.Key); return await _scheduler.GetTriggerState(trigger.Key);
} public async Task<TriggerState> PauseJob(string jobName, string jobGroupName = JOB_GROUP_NAME, string triggerName = null, string triggerGroupName = TRIGGER_GROUP_NAME)
{
IJobDetail job;
ITrigger trigger; job = await _scheduler.GetJobDetail(new JobKey(jobName, jobGroupName));
trigger = await _scheduler.GetTrigger(new TriggerKey(triggerName ?? jobName, triggerGroupName));
if (job == null || trigger == null)
{
return TriggerState.None;
} await _scheduler.PauseJob(job.Key); return await _scheduler.GetTriggerState(trigger.Key);
} public async Task<TriggerState> ResumeJob(string jobName, string jobGroupName = JOB_GROUP_NAME, string triggerName = null, string triggerGroupName = TRIGGER_GROUP_NAME)
{
IJobDetail job;
ITrigger trigger; job = await _scheduler.GetJobDetail(new JobKey(jobName, jobGroupName));
trigger = await _scheduler.GetTrigger(new TriggerKey(triggerName ?? jobName, triggerGroupName));
if (job == null || trigger == null)
{
return TriggerState.None;
} await _scheduler.ResumeJob(job.Key); return await _scheduler.GetTriggerState(trigger.Key);
} public async Task<TriggerState> GetJobState(string jobName, string jobGroupName = JOB_GROUP_NAME, string triggerName = null, string triggerGroupName = TRIGGER_GROUP_NAME)
{
IJobDetail job;
ITrigger trigger; job = await _scheduler.GetJobDetail(new JobKey(jobName, jobGroupName));
trigger = await _scheduler.GetTrigger(new TriggerKey(triggerName ?? jobName, triggerGroupName));
if (job == null || trigger == null)
{
return TriggerState.None;
}
return await _scheduler.GetTriggerState(trigger.Key);
} public async Task InitJobs()
{
if (_scheduler != null)
{
return;
} //配置文件的方式,配置quartz实例
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
_scheduler = await schedulerFactory.GetScheduler();
} public async Task StartJobs()
{
if (_scheduler != null)
{
await _scheduler.Start(); return;
} //配置文件的方式,配置quartz实例
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
_scheduler = await schedulerFactory.GetScheduler();
await _scheduler.Start();
} public void StandbyJobs()
{
try
{
if (_scheduler == null) return;
if (!_scheduler.InStandbyMode)
{
_scheduler.Standby();
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} public void RestartJobs()
{
_scheduler.Shutdown();
_scheduler.Start();
} public DateTime[] GetNextRunTime(string cronExpression, DateTime? startTime,DateTime? endTime, int number = )
{
try
{
ITrigger trigger = null;
if (startTime == null && endTime == null)
{
trigger = TriggerBuilder.Create()
.WithCronSchedule(cronExpression)
.Build();
}
else if (startTime != null && endTime == null)
{
trigger = TriggerBuilder.Create()
.StartAt(CronHelper.DateTime2DateTimeOffset(startTime.Value))
.WithCronSchedule(cronExpression)
.Build();
}
else if (startTime == null && endTime != null)
{
trigger = TriggerBuilder.Create()
.EndAt(CronHelper.DateTime2DateTimeOffset(endTime.Value))
.WithCronSchedule(cronExpression)
.Build();
}
else
{
trigger = TriggerBuilder.Create()
.StartAt(CronHelper.DateTime2DateTimeOffset(startTime.Value))
.EndAt(CronHelper.DateTime2DateTimeOffset(endTime.Value))
.WithCronSchedule(cronExpression)
.Build();
} IList<DateTimeOffset> dates = TriggerUtils.ComputeFireTimes(trigger as IOperableTrigger, null, number).ToList();
if (dates != null && dates.Count > )
{
return dates.Select(p => TimeZoneInfo.ConvertTimeFromUtc(p.DateTime, TimeZoneInfo.Local)).ToArray();
}
}
catch (Exception ex)
{ }
return null;
}
}

执行一个每5s执行一次的例子如下:

var TriggerState = await QuartzHelper.Instance.StartJobExecuteByCron<HelloJob>("0/5 * * * * ?", "测试1");

  

代码下载地址如下:https://pan.baidu.com/s/1W1UwoFPgyfo_ETDpHeEGsg

定时任务 Wpf.Quartz.Demo.1的更多相关文章

  1. 定时任务 Wpf.Quartz.Demo.4

    本文继续介绍定时任务 Wpf.Quartz.Demo.3的一些小细节, 代码也请前往第3节下载. 1.RichTextBox右键菜单 <RichTextBox.ContextMenu>   ...

  2. 定时任务 Wpf.Quartz.Demo.2

    定时任务 Wpf.Quartz.Demo.1已经能运行了,本节开始用wpf搭界面. 准备工作: 1.界面选择MahApp.Metro 在App.xaml添加资源 <Application.Res ...

  3. 定时任务 Wpf.Quartz.Demo.5 (升级版)

    老规矩:先把全部源码上传,见本文底部. 相对于Demo3的区别,就是能自动加载继承了IJob的任务,任务主体程序分离. 在exe执行文件的同级下建一个MyJobs的文件夹,每次会自动扫描该文件夹下的J ...

  4. 定时任务 Wpf.Quartz.Demo.3

    先把全部源码上传,只是一个Demo,希望大家指点一下不足之处,见本文底部. 1.设置界面 2.详情页面 好了,现在慢慢叙述里面的一些方法. 3.实现拷贝的方法: (1) public static v ...

  5. [转][JAVA]定时任务之-Quartz使用篇

    [BAT][JAVA]定时任务之-Quartz使用篇 定时任务之-Quartz使用篇 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与 ...

  6. Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置

    Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置 >>>>>>>>>>>>&g ...

  7. 震惊!Windows Service服务和定时任务框架quartz之间原来是这种关系……

    过场CG:   接到公司领导的文件指示,“小熊”需要在6月底去海外执行一个行动代号为[定时任务]的营救计划,这个计划关系到公司某个项目的生死(数据安全漏洞),作战部拟定两个作战方案: 方案一:使用务定 ...

  8. SpringBoot定时任务 - 集成quartz实现定时任务(单实例和分布式两种方式)

    最为常用定时任务框架是Quartz,并且Spring也集成了Quartz的框架,Quartz不仅支持单实例方式还支持分布式方式.本文主要介绍Quartz,基础的Quartz的集成案例本,以及实现基于数 ...

  9. Spring 整合 Quartz 实现动态定时任务(附demo)

    最近项目中需要用到定时任务的功能,虽然Spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 普通定时任务 首先 ...

随机推荐

  1. Moving Average from Data Stream LT346

    Given a stream of integers and a window size, calculate the moving average of all integers in the sl ...

  2. vb中去掉string数组的一部分

    今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBir ...

  3. Python导入自定义类时显示错误:attempted relative import beyond top-level package

    显示这个错误可能有两个原因: 1.文件夹中没有包含__init__.py文件,该文件可以为空,但必须存在该文件. 2.把该文件当成主函数入口,该文件所在文件夹不能被解释器视作package,所以可能导 ...

  4. git版本控制工具的使用(1)。

    为了使用. 感谢:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 讲解的很清晰, ...

  5. kbmmw 5.0 中的REST 服务

    目前关于REST 服务的话题越来越热,kbmmw 在5.0 里面开始支持rest.今天我就试一下kbmmw 的 rest 服务.闲话少说,开始. 老规矩,放上两个kbmMWServer1和 kbmMW ...

  6. 2018.11.14 uoj#34. 多项式乘法(fft)

    传送门 NOIpNOIpNOIp爆炸不能阻止我搞oioioi的决心 信息技术课进行一点康复训练. fftfftfft板题. 代码: #include<bits/stdc++.h> usin ...

  7. 2018.10.30 bzoj4942: [Noi2017]整数(线段树压位)

    传送门 直接把修改的数拆成logloglog个二进制位一个一个修改是会TLETLETLE的. 因此我们把303030个二进制位压成一位储存在线段树里面. 然后维护区间中最靠左二进制位不为0/1的下标. ...

  8. 用jquery实现复选框全选全不选问题(完整版),在网络上怎么也找不到完整的解决方案,重要搞全了

    首先准备jsp页面控件: 请选择您的爱好:<br> <input type="checkbox" id="all" name="se ...

  9. Windows 下 Quartus 检测不到 USB-Blaster 终极解决办法

    转自https://blog.csdn.net/acang301/article/details/50471067?locationNum=12 一.Windows无法正常驱动USB-Blaster ...

  10. Struts2之ModelDriven和Preparable拦截器

    首先struts.xml文件配置如下 默认拦截器设置为paramsPrepareParamsStack <package name="default" namespace=& ...