用C#實現定時/循環任務,需要使用到Quartz,在項目的NuGet包管理中可以找到並添加。一般還會伴隨安裝一個Log4Net,主要用它來記錄在任務執行過程中遇到的問題。這邊主要是講實現定時/循環任務,就不再贅述。
要實現定時/循環任務,就需要用到C#的作業和觸發器
作業:
1.作業創建:
JobBuilder.Create<TestJob>() 這里的<TestJob>就是你實現具體任務的類
1 IJobDetail job1 = JobBuilder.Create<TestJob>() 2 .WithIdentity(jobName, gropName) //為該job的jobName和gropName賦值,相當於給予一個身份(非必須) 3 .UsingJobData("key", "value")//為作業的具體任務傳遞參數,鍵值對(非必須) 4 .Build();//創建作業(必須)
2.作業的具體任務
這時候要創建一個類,繼承IJob,並實現接口方法,此方法是觸發器觸發時調用的方法,所以在這里寫你的任務。
using log4net; using Quartz; using System;using System.Threading.Tasks; namespace BackgroundTask.job { public class TestJob : IJob { private readonly ILog _log = LogManager.GetLogger(typeof(TestJob));//利用Log來記錄在任務執行過程中遇到的問題 public void Execute(IJobExecutionContext context) { JobDataMap dataMap = context.JobDetail.JobDataMap; string k = dataMap.GetString("key");//在這里獲取到參數,有GetInt,GetXXX等等,滿足參數的類型需求// 以下開始寫你的任務代碼, Console.WriteLine(“123321”); } } }
觸發器:
1.觸發器的聲明
現在的版本,觸發器創建和設置需要采用異步方法。
IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler(); //從工廠中獲取一個調度器實例化
2.觸發器的設置
循環觸發器設置:
// 創建觸發器 ITrigger trigger1 = TriggerBuilder.Create() .WithIdentity(tiggerName, gropName) //為觸發器的tiggerName和gropName賦值,相當與給予一個身份 .StartNow() //現在開始 .WithSimpleSchedule(x => x .WithIntervalInSeconds(10) //觸發時間,10秒一次。 .RepeatForever()) //不間斷重復執行 .Build(); //最終創建 await scheduler.ScheduleJob(job1, trigger1); //把作業,觸發器加入調度器。
await scheduler.Start();
定時觸發器設置:
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() //.StartAt(startTime).EndAt(endTime) //開始時間,結束時間 .WithCronSchedule(cronExpression) //設置定時觸發規則 cronExpression字符串就包含了規則 .Build(); //最終創建 await scheduler.ScheduleJob(job1, trigger); await scheduler.Start();
任務和觸發器的關閉
還記得在創建作業和觸發器時候給的那個身份嗎?在關閉的時候可以指定關閉對象
TriggerKey triggerKey = new TriggerKey(tiggerName, gropName); JobKey jobKey = new JobKey(jobName, gropName); if (scheduler != null) { scheduler.PauseTrigger(triggerKey); scheduler.UnscheduleJob(triggerKey); scheduler.DeleteJob(jobKey); scheduler.Shutdown();// 關閉 }
自此,我們對實現定時/循環任務就有了個清晰的思路
1 新建一個控制台項目。
2 建一個類,在此類中創建作業和觸發器。
3 再建一個類,此類繼承IJob接口,實現Excute方法。此類作為作業的具體實行任務。
4 執行該項目。
附帶知識點:
CronExpression 規則