首页 > 系统相关 >c# 4.8 实现Windows 定时任务计划(Task Scheduler)

c# 4.8 实现Windows 定时任务计划(Task Scheduler)

时间:2024-02-28 13:34:53浏览次数:23  
标签:case Task return get c# 28 4.8 public taskSchedulerConfig

分享一个我自己写的 Windows 定时任务计划(Task Scheduler) 动态创建代码,没做太多封装,留个实现笔记

首先封装一个简单配置项的类

 1 public class TaskSchedulerConfig
 2 {
 3     /// <summary>
 4     /// 引用程序路径
 5     /// </summary>
 6     public string ApplicationPath { get; set; }
 7     /// <summary>
 8     /// 引用程序参数
 9     /// </summary>
10     //public string ApplicationParameter { get; set; }
11     /// <summary>
12     /// 任务名称
13     /// </summary>
14     public string TaskName { get; set; }
15     /// <summary>
16     /// 任务说明
17     /// </summary>
18     public string TaskDescription { get; set; }
19     /// <summary>
20     /// 任务执行周期 0 每日执行 1 每周执行 2 每月执行
21     /// </summary>
22     public int TaskExecutionCycle { get; set; }
23     /// <summary>
24     /// 开始执行时间范围 yyyy/MM/dd HH:mm:ss
25     /// </summary>
26     public DateTime StartBoundary { get; set; }
27     /// <summary>
28     /// 每月的第几号执行
29     /// </summary>
30     public int DaysOfMonth { get; set; }
31     /// <summary>
32     /// 每周的周几执行
33     /// </summary>
34     public int DaysOfWeek { get; set; }
35 
36 
37 }
View Code
 1 /// <summary>
 2         /// 根据数字1-7来设置周一 - 周日
 3         /// </summary>
 4         /// <param name="num"></param>
 5         /// <returns></returns>
 6         static DaysOfTheWeek GetDaysOfTheWeek(int num)
 7         {
 8             switch (num)
 9             {
10                 case 1:
11                     return DaysOfTheWeek.Monday;
12                 case 2:
13                     return DaysOfTheWeek.Tuesday;
14                 case 3:
15                     return DaysOfTheWeek.Wednesday;
16                 case 4:
17                     return DaysOfTheWeek.Thursday;
18                 case 5:
19                     return DaysOfTheWeek.Friday;
20                 case 6:
21                     return DaysOfTheWeek.Saturday;
22                 case 7:
23                     return DaysOfTheWeek.Sunday;
24                 default:
25                     throw new ArgumentException("无效的数字。请提供1到7之间的数字。");
26             }
27         }
28         /// <summary>
29         /// 限定每月只能在1-28号之间执行任务
30         /// </summary>
31         /// <param name="num"></param>
32         /// <returns></returns>
33         static int GetDaysOfMonth(int num)
34         {
35             if (num < 1 || num > 28)
36             {
37                 throw new ArgumentException("无效的数字。请提供1到28之间的数字。");
38             }
39             return num;
40         }
两个范围判定的方法
 1 static void Main(string[] args)
 2         {           
 3 
 4             TaskSchedulerConfig taskSchedulerConfig;
 5             try
 6             {
 7                 var taskSchedulerConfigJson = args[0];
 8                 taskSchedulerConfig = JsonConvert.DeserializeObject<TaskSchedulerConfig>(taskSchedulerConfigJson);
 9             }
10             catch
11             {
12                 string demo = @"{
13                           ""ApplicationPath"": ""C:\\YourApplication\\YourExecutable.exe"",
14                           ""TaskName"": ""DailyTask"",
15                           ""TaskDescription"": ""This is a daily task"",
16                           ""TaskExecutionCycle"": 0,
17                           ""StartBoundary"": ""2024/02/28 08:00:00"",
18                           ""DaysOfMonth"": 28,
19                           ""DaysOfWeek"": 3
20                         }";
21 
22                 Console.WriteLine($"参数错误,正确示例:{demo}");
23                 return;
24             }
25 
26 
27             try
28             {
29                 using (TaskService taskService = new TaskService())
30                 {
31                     // 创建一个新任务
32                     TaskDefinition taskDefinition = taskService.NewTask();
33                     taskDefinition.Principal.UserId = "SYSTEM"; // 设置为SYSTEM以在系统级别运行
34                     // 设置任务的基本信息
35                     taskDefinition.RegistrationInfo.Description = taskSchedulerConfig.TaskDescription;
36 
37                     switch (taskSchedulerConfig.TaskExecutionCycle)
38                     {
39                         case 0:
40                             DailyTrigger dailyTrigger = new DailyTrigger();
41                             dailyTrigger.StartBoundary = taskSchedulerConfig.StartBoundary;
42                             dailyTrigger.DaysInterval = 1; // 每天执行
43                             taskDefinition.Triggers.Add(dailyTrigger);
44                             break;
45                         case 1:
46                             WeeklyTrigger weeklyTrigger = new WeeklyTrigger();
47                             weeklyTrigger.StartBoundary = taskSchedulerConfig.StartBoundary;
48                             weeklyTrigger.DaysOfWeek = GetDaysOfTheWeek(taskSchedulerConfig.DaysOfWeek);
49                             weeklyTrigger.WeeksInterval = 1; // 每隔1周执行
50                             taskDefinition.Triggers.Add(weeklyTrigger);
51                             break;
52                         case 2:
53                             MonthlyTrigger monthlyTrigger = new MonthlyTrigger();
54                             monthlyTrigger.StartBoundary = taskSchedulerConfig.StartBoundary;
55                             monthlyTrigger.DaysOfMonth = new[] { GetDaysOfMonth(taskSchedulerConfig.DaysOfMonth) };
56                             monthlyTrigger.MonthsOfYear = MonthsOfTheYear.AllMonths; // 每个月执行
57                             taskDefinition.Triggers.Add(monthlyTrigger);
58                             break;
59                         default:
60                             Console.WriteLine("任务执行周期参数错误!正确示例:0 每日执行 1 每周执行 2 每月执行");
61                             break;
62                     }
63 
64 
65 
66                     // 设置要执行的程序路径
67                     taskDefinition.Actions.Add(new ExecAction(taskSchedulerConfig.ApplicationPath, null, null));
68 
69                     // 将任务注册到 Windows 任务计划程序
70                     taskService.RootFolder.RegisterTaskDefinition(taskSchedulerConfig.TaskName, taskDefinition);
71                     Console.WriteLine("任务计划创建成功!");
72                 }
73             }
74             catch (Exception ex)
75             {
76                 Console.WriteLine($"创建{taskSchedulerConfig.TaskName} 任务错误,错误原因是:{ex.Message}");
77             }
78 
79            
80         }
Main

 

标签:case,Task,return,get,c#,28,4.8,public,taskSchedulerConfig
From: https://www.cnblogs.com/INetIMVC/p/18040041

相关文章

  • Oracle-JPA扩展工具-原生SQL查询并返回自定义DTO
    Java-JPA原生SQL查询返回自定义DTO:importcom.tjgeo.njsosms.framework.repository.IBaseRepository;importcom.tjgeo.njsosms.risk.support.entity.Source;importorg.springframework.data.jpa.repository.Query;importjava.util.List;/***${Description}**@......
  • 记一次WPF集成SemanticKernel+OneAPI+讯飞星火认知大模型实践
    开启OneAPI服务OneAPI介绍OpenAI接口管理&分发系统,支持Azure、AnthropicClaude、GooglePaLM2&Gemini、智谱ChatGLM、百度文心一言、讯飞星火认知、阿里通义千问、360智脑以及腾讯混元,可用于二次分发管理key,仅单可执行文件,已打包好Docker镜像,一键部署,开箱即用.Ope......
  • 龙哥量化:通达信(副图)选股公式源码均线、macd、skdj、kdj、rsi、dmi、cci,vol共振
    如果您需要代写公式,请联系我。龙哥QQ:591438821龙哥微信:Long622889 这个公式是几个指标的共振。新建一个条件选股公式,新建一个副图公式,都用下面的源码; {取消的股票 }T1:=IF(NAMELIKE('ST'),0,1)ANDIF(NAMELIKE('*'),0,1);T2:=NOT(CODELIKE('688'));T3:=NOT(CODELI......
  • becoming a Linux Kernal Hacker (books recommended)
    UnderstandingtheLinuxKernel,ThirdEdition3rdEditionbyDanielBovet(Author),MarcoCesati(Author)https://www.amazon.com/Understanding-Linux-Kernel-Third-Daniel/dp/0596005652/UnderstandingLinuxNetworkInternals:GuidedTourtoNetworkingonLinu......
  • CF756D Bacterial Melee 题解
    给一个\(O(n^2)\)的做法。考虑从左到右扫描最终得到的字符串,如果当前的字符和前一个字符相同,就删掉这个字符。由题意可知,最终得到的字符串一定是\(s\)的一个子序列。我们定义状态\(dp[i][j]\)表示:当前子序列的最后一个字符是\(s[i]\),已经填完了最终字符串的前\(j\)个字......
  • CF1034E Little C Loves 3 III 题解
    这道题与P6097【模板】子集卷积基本相同,但是每个元素的值属于\([0,3]\),且\(n\le21\),时限\(\rm1s\)。在做P6097这道题的时候,我们多开了一维用来记录二进制下\(1\)的个数。但是这道题每个元素的值只属于\([0,3]\),我们可以用一种十分巧妙的方法:我们设\(f(x)\)表示\(......
  • CF111D Petya and Coloring 题解
    很明显这是一道组合题。首先特判一下,当\(m=1\)时,答案就是\(k^n\)。对于\(m>1\)的情况,我们可以得出一个结论:对于沿格子的线穿过的任何垂直线,会将棋盘分成两个非空的部分,这两个部分中的不同颜色的数量相同且总是不变。设这个不同颜色的数量为\(i\),那么左边这部分的颜色一定......
  • [USACO13MAR]Farm Painting S 题解
    看大家好多写的都用了四维偏序,给一个不用偏序的解法。简化一下题目,就是给你\(n\)个矩形,第\(i\)个矩形用\((x1_i,y1_i,x2_i,y2_i)\)表示,问你有多少个\(i\)满足:不存在另一个\(j\)使得\(x1_j\lex1_i\lex2_j\wedgey1_j\ley1_i\ley2_j\)。我们从左到右扫描每一个......
  • Taurus.MVC WebMVC 入门开发教程4:数据列表绑定List<Model>
    前言:在本篇Taurus.MVCWebMVC入门开发教程的第四篇文章中,我们将学习如何实现数据列表的绑定,通过使用List<Model>来展示多个数据项。我们将继续使用Taurus.Mvc命名空间,同时探讨如何在视图中绑定并显示一个Model列表。步骤1:创建Model首先,我们需要更新我们的Model类,......
  • C#中的线程简介
    C#中的线程简介为什么要使用线程同一时间智能运行一个任务,长时间运行的任务独占整个计算机,造成其他程序无法响应。如果程序有bug会造成整个机器停止工作,用户只好重启计算机,造成数据丢失。于是,人们为操作系统引入了线程的概念。线程就是对CPU的虚拟化。一个线程就是一个逻辑......