C#實(shí)現(xiàn)定時(shí)任務(wù)Task Scheduler的示例代碼
本文和大家分享一個(gè)自己寫的 Windows 定時(shí)任務(wù)計(jì)劃(Task Scheduler) 動(dòng)態(tài)創(chuàng)建代碼,沒做太多封裝,留個(gè)實(shí)現(xiàn)筆記
首先封裝一個(gè)簡單配置項(xiàng)的類
核心代碼
public class TaskSchedulerConfig { /// <summary> /// 引用程序路徑 /// </summary> public string ApplicationPath { get; set; } /// <summary> /// 引用程序參數(shù) /// </summary> //public string ApplicationParameter { get; set; } /// <summary> /// 任務(wù)名稱 /// </summary> public string TaskName { get; set; } /// <summary> /// 任務(wù)說明 /// </summary> public string TaskDescription { get; set; } /// <summary> /// 任務(wù)執(zhí)行周期 0 每日執(zhí)行 1 每周執(zhí)行 2 每月執(zhí)行 /// </summary> public int TaskExecutionCycle { get; set; } /// <summary> /// 開始執(zhí)行時(shí)間范圍 yyyy/MM/dd HH:mm:ss /// </summary> public DateTime StartBoundary { get; set; } /// <summary> /// 每月的第幾號(hào)執(zhí)行 /// </summary> public int DaysOfMonth { get; set; } /// <summary> /// 每周的周幾執(zhí)行 /// </summary> public int DaysOfWeek { get; set; } }
兩個(gè)范圍判定的方法
/// <summary> /// 根據(jù)數(shù)字1-7來設(shè)置周一 - 周日 /// </summary> /// <param name="num"></param> /// <returns></returns> static DaysOfTheWeek GetDaysOfTheWeek(int num) { switch (num) { case 1: return DaysOfTheWeek.Monday; case 2: return DaysOfTheWeek.Tuesday; case 3: return DaysOfTheWeek.Wednesday; case 4: return DaysOfTheWeek.Thursday; case 5: return DaysOfTheWeek.Friday; case 6: return DaysOfTheWeek.Saturday; case 7: return DaysOfTheWeek.Sunday; default: throw new ArgumentException("無效的數(shù)字。請?zhí)峁?到7之間的數(shù)字。"); } } /// <summary> /// 限定每月只能在1-28號(hào)之間執(zhí)行任務(wù) /// </summary> /// <param name="num"></param> /// <returns></returns> static int GetDaysOfMonth(int num) { if (num < 1 || num > 28) { throw new ArgumentException("無效的數(shù)字。請?zhí)峁?到28之間的數(shù)字。"); } return num; }
Main
static void Main(string[] args) { TaskSchedulerConfig taskSchedulerConfig; try { var taskSchedulerConfigJson = args[0]; taskSchedulerConfig = JsonConvert.DeserializeObject<TaskSchedulerConfig>(taskSchedulerConfigJson); } catch { string demo = @"{ ""ApplicationPath"": ""C:\\YourApplication\\YourExecutable.exe"", ""TaskName"": ""DailyTask"", ""TaskDescription"": ""This is a daily task"", ""TaskExecutionCycle"": 0, ""StartBoundary"": ""2024/02/28 08:00:00"", ""DaysOfMonth"": 28, ""DaysOfWeek"": 3 }"; Console.WriteLine($"參數(shù)錯(cuò)誤,正確示例:{demo}"); return; } try { using (TaskService taskService = new TaskService()) { // 創(chuàng)建一個(gè)新任務(wù) TaskDefinition taskDefinition = taskService.NewTask(); taskDefinition.Principal.UserId = "SYSTEM"; // 設(shè)置為SYSTEM以在系統(tǒng)級(jí)別運(yùn)行 // 設(shè)置任務(wù)的基本信息 taskDefinition.RegistrationInfo.Description = taskSchedulerConfig.TaskDescription; switch (taskSchedulerConfig.TaskExecutionCycle) { case 0: DailyTrigger dailyTrigger = new DailyTrigger(); dailyTrigger.StartBoundary = taskSchedulerConfig.StartBoundary; dailyTrigger.DaysInterval = 1; // 每天執(zhí)行 taskDefinition.Triggers.Add(dailyTrigger); break; case 1: WeeklyTrigger weeklyTrigger = new WeeklyTrigger(); weeklyTrigger.StartBoundary = taskSchedulerConfig.StartBoundary; weeklyTrigger.DaysOfWeek = GetDaysOfTheWeek(taskSchedulerConfig.DaysOfWeek); weeklyTrigger.WeeksInterval = 1; // 每隔1周執(zhí)行 taskDefinition.Triggers.Add(weeklyTrigger); break; case 2: MonthlyTrigger monthlyTrigger = new MonthlyTrigger(); monthlyTrigger.StartBoundary = taskSchedulerConfig.StartBoundary; monthlyTrigger.DaysOfMonth = new[] { GetDaysOfMonth(taskSchedulerConfig.DaysOfMonth) }; monthlyTrigger.MonthsOfYear = MonthsOfTheYear.AllMonths; // 每個(gè)月執(zhí)行 taskDefinition.Triggers.Add(monthlyTrigger); break; default: Console.WriteLine("任務(wù)執(zhí)行周期參數(shù)錯(cuò)誤!正確示例:0 每日執(zhí)行 1 每周執(zhí)行 2 每月執(zhí)行"); break; } // 設(shè)置要執(zhí)行的程序路徑 taskDefinition.Actions.Add(new ExecAction(taskSchedulerConfig.ApplicationPath, null, null)); // 將任務(wù)注冊到 Windows 任務(wù)計(jì)劃程序 taskService.RootFolder.RegisterTaskDefinition(taskSchedulerConfig.TaskName, taskDefinition); Console.WriteLine("任務(wù)計(jì)劃創(chuàng)建成功!"); } } catch (Exception ex) { Console.WriteLine($"創(chuàng)建{taskSchedulerConfig.TaskName} 任務(wù)錯(cuò)誤,錯(cuò)誤原因是:{ex.Message}"); } }
到此這篇關(guān)于C#實(shí)現(xiàn)定時(shí)任務(wù)Task Scheduler的示例代碼的文章就介紹到這了,更多相關(guān)C#定時(shí)任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)輸入10個(gè)數(shù)存入到數(shù)組中并求max和min及平均數(shù)的方法示例
這篇文章主要介紹了C#實(shí)現(xiàn)輸入10個(gè)數(shù)存入到數(shù)組中并求max和min及平均數(shù)的方法,涉及C#簡單數(shù)據(jù)轉(zhuǎn)換與數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-07-07C#實(shí)現(xiàn)萬物皆可排序的隊(duì)列方法詳解
本文詳細(xì)講解了C#實(shí)現(xiàn)萬物皆可排序隊(duì)列的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07C# 文件操作函數(shù) 創(chuàng)建文件 判斷存在
本文列舉了C#中文件操作中常用的函數(shù),創(chuàng)建文件和判斷文件存不存在的基本使用,簡單實(shí)用,希望能幫到大家。2016-05-05c#斐波那契數(shù)列(Fibonacci)(遞歸,非遞歸)實(shí)現(xiàn)代碼
c#斐波那契數(shù)列(Fibonacci)(遞歸,非遞歸)實(shí)現(xiàn)代碼,需要的朋友可以參考一下2013-05-05在C#中如何使用ResNet50v2進(jìn)行圖像識(shí)別
ONNX?運(yùn)行時(shí)推理可以實(shí)現(xiàn)更快的客戶體驗(yàn)和更低的成本,支持來自深度學(xué)習(xí)框架如?PyTorch和TensorFlow/Keras以及經(jīng)典機(jī)器學(xué)習(xí)庫如?scikit-learn、LightGBM、XGBoost?等的模型,這篇文章主要介紹了在C#中如何使用ResNet50v2進(jìn)行圖像識(shí)別,需要的朋友可以參考下2024-07-07C# Distinct和重寫IEqualityComparer時(shí)要知道的二三事
這篇文章主要給大家介紹了關(guān)于C# Distinct和重寫IEqualityComparer時(shí)要知道的二三事,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06C#實(shí)現(xiàn)在窗體上的統(tǒng)計(jì)圖效果
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)在窗體上的統(tǒng)計(jì)圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02