Quartz.net 的原理可以移步深入解读Quartz的原理,写的很好,很详细。
1、创建一个4.5.2的控制台程序为最佳。
2、nuget引用Quartz.net 3.0.7为最佳。
3、配置一个执行调度的时间。
/** Cron表达式 http://www.bejson.com/othertools/cronvalidate/ * 15 0/1 * * * ? 每分钟的第15秒执行 * 0/15 * * * * ? 每15秒运行一次 * 0 0 1 * * ? 每日凌晨一点执行一次 * 0 0 0 * * ? 每日凌晨12点执行一次待验证 * 0 0 1 ? * WED 每周三 凌晨1点执行 * 0 0 2 1 * ? 每月1号凌晨2点执行一次 */ <!--自动取消订单 10秒一次--> <add key="AutoCancelOrdTime" value="0/10 * * * * ?" />
准备工作完毕,直接上代码。
using Quartz; using Quartz.Impl; using System; using System.IO; using System.Linq; using System.Threading; using System.Windows.Forms; namespace Go.Campuses.Order.AutoTask { public partial class AutoOrder : Form { /// <summary> /// The scheduler /// </summary> IScheduler _scheduler = null; /// <summary> /// 自动取消订单定时配置 /// </summary> public static readonly string AutoCancelOrdTime =ConfigHelper.GetConfigToString("AutoCancelOrdTime");// 0/10 * * * * ? 10秒钟执行一次 public AutoOrder() { InitializeComponent(); } /// <summary> /// 加载事件 /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> private void AutoCancelOrd_Load(object sender, EventArgs e) { Thread taskThread = new Thread(StartTask); taskThread.Start(); string v = AppDomain.CurrentDomain.BaseDirectory.Split(new char[] {Path.DirectorySeparatorChar},StringSplitOptions.RemoveEmptyEntries).Last(); RichTextBox.AppendText($" {v} \r\n"); RichTextBox.AppendText($"自动取消未支付订单任务-启动成功\r\n"); } /// <summary> ///启动任务 /// </summary> private async void StartTask() { ISchedulerFactory sf = new StdSchedulerFactory(); if (_scheduler == null) { _scheduler = await sf.GetScheduler(); } await _scheduler.Start(); #region 自动取消未支付订单 //创建任务对象 IJobDetail job1 = JobBuilder.Create<EveryAutoCancelOrdJob>().WithIdentity("job1", "group1").Build(); //创建触发器 ITrigger trigger1 = TriggerBuilder.Create().WithIdentity("trigger1", "group1").StartNow().WithCronSchedule(AutoCancelOrdTime).Build(); #endregion await _scheduler.ScheduleJob(job1, trigger1); } } }
还需要一个EveryAutoCancelOrdJob任务类。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Go.Campuses.Order.NetWork.WcfHelper; using Quartz; namespace Go.Campuses.Order.AutoTask.Comm { /// <summary> ///自动取消未支付订单任务类 /// </summary> /// <seealso cref="Quartz.IJob" /> public class EveryAutoCancelOrdJob : IJob { /// <summary> /// 作业调度定时执行的方法 /// </summary> /// <param name="context">The execution context.</param> /// <returns>Task.</returns> /// <remarks>The implementation may wish to set a result object on the /// JobExecutionContext before this method exits. The result itself /// is meaningless to Quartz, but may be informative to /// <see cref="T:Quartz.IJobListener" />s or /// <see cref="T:Quartz.ITriggerListener" />s that are watching the job's /// execution.</remarks> public virtual Task Execute(IJobExecutionContext context) { return Task.Factory.StartNew(() => { EveryTask(); }); } /// <summary> ///任务实现 直接调用服务或者具体逻辑代码 /// </summary> public void EveryTask() { try { Result ret = WcfHelper.AutoCancelOrd(); } catch { } } } }
欢迎大家伙儿交流和提出问题!
留下您的脚步
最近评论