1. 程式人生 > 其它 >C# Quartz.Net 定時任務的簡單使用

C# Quartz.Net 定時任務的簡單使用

引用自:https://www.cnblogs.com/chenyucong/p/6264739.html,僅用做參考。

最近做了一個定時執行任務的軟體。

執行任務時,會使用log4net記錄日誌,如果執行任務有異常,則傳送郵件給指定的物件。

我做的是每天的9點和16點執行一次任務,以此記錄:

首先,獲得Quartz.Net,

其實可以使用vs2015的Nuget管理器,下載。

我做了一個QuartzHelper,但是在主程式中,還是需要其他程式碼的。

這是QuartzHelper的程式碼:

using Quartz;
using Quartz.Impl;

namespace Cong.Utility
{
    public class QuartzHelper
    {
        /// <summary>
        /// 時間間隔執行任務
        /// </summary>
        /// <typeparam name="T">任務類,必須實現IJob介面</typeparam>
        /// <param name="seconds">時間間隔(單位:毫秒)</param>
        public static void ExecuteInterval<T>(int seconds) where T : IJob
        {
            ISchedulerFactory factory = new StdSchedulerFactory();
            IScheduler scheduler = factory.GetScheduler();

            //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();

            scheduler.ScheduleJob(job, trigger);

            scheduler.Start();
        }

        /// <summary>
        /// 指定時間執行任務
        /// </summary>
        /// <typeparam name="T">任務類,必須實現IJob介面</typeparam>
        /// <param name="cronExpression">cron表示式,即指定時間點的表示式</param>
        public static void ExecuteByCron<T>(string cronExpression) where T : IJob
        {
            ISchedulerFactory factory = new StdSchedulerFactory();
            IScheduler scheduler = factory.GetScheduler();

            IJobDetail job = JobBuilder.Create<T>().Build();

            //DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
            //DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddYears(2), 3);

            ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                //.StartAt(startTime).EndAt(endTime)
                .WithCronSchedule(cronExpression)
                .Build();

            scheduler.ScheduleJob(job, trigger);

            scheduler.Start();

            //Thread.Sleep(TimeSpan.FromDays(2));
            //scheduler.Shutdown();
        }
    }

    #region 任務執行例
    //public class MyJob : IJob
    //{
    //    public void Execute(IJobExecutionContext context)
    //    {
    //        Console.WriteLine("executed..." + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
    //    }
    //} 
    #endregion
}

大概的過程是這樣的:
通過ISchedulerFactory例項化一個計劃工廠物件,並使用工廠例項化一個scheduler計劃物件,

然後例項化一個任務物件job,也就是定義任務內容的物件,需要傳入一個實現IJob介面的類,這裡我使用了泛型,

接著,需要一個能觸發任務的物件,這裡有兩種,

一種是ITrigger,這是用於規格時間間隔,計劃開始後,會根據間隔的時間值,觸發執行任務;

另一種是ICronTrigger,這是通過Cron表示式規格執行的時間,計劃開始後,如果時間符合規定時間,就觸發執行任務。

最後,把job和trigger都傳入計劃scheduler,計劃開始。

最下方的任務執行例是一個例子,

必須實現IJob介面和Execute方法。

如果需要在Execute方法內,呼叫類外部的資料,我是通過在專案中定義靜態類的方法,供MyJob呼叫的。

程式開始計劃的程式碼:

string cronExpression = "0 0 9,16 * * ? ";  =>這是指每天的9點和16點執行任務
QuartzHelper.ExecuteByCron<MyJob>(cronExpression);  =>這是呼叫Cron計劃方法

簡單說一下Cron表示式吧,

"0 0 9,16 * * ?",

順序從左到右

0:秒

0:分

9,16:小時,逗號分隔

如果需要更詳細的說明,可以百度。