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

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

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

复制代码
public class TaskSchedulerConfig
{
    /// <summary>
    /// 引用程序路径
    /// </summary>
    public string ApplicationPath { get; set; }
    /// <summary>
    /// 引用程序参数
    /// </summary>
    //public string ApplicationParameter { get; set; }
    /// <summary>
    /// 任务名称
    /// </summary>
    public string TaskName { get; set; }
    /// <summary>
    /// 任务说明
    /// </summary>
    public string TaskDescription { get; set; }
    /// <summary>
    /// 任务执行周期 0 每日执行 1 每周执行 2 每月执行
    /// </summary>
    public int TaskExecutionCycle { get; set; }
    /// <summary>
    /// 开始执行时间范围 yyyy/MM/dd HH:mm:ss
    /// </summary>
    public DateTime StartBoundary { get; set; }
    /// <summary>
    /// 每月的第几号执行
    /// </summary>
    public int DaysOfMonth { get; set; }
    /// <summary>
    /// 每周的周几执行
    /// </summary>
    public int DaysOfWeek { get; set; }
}

         /// <summary>
         /// 根据数字1-7来设置周一 - 周日
         /// </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("无效的数字。请提供1到7之间的数字。");
             }
         }
         /// <summary>
         /// 限定每月只能在1-28号之间执行任务
         /// </summary>
         /// <param name="num"></param>
         /// <returns></returns>
         static int GetDaysOfMonth(int num)
         {
             if (num < 1 || num > 28)
             {
                 throw new ArgumentException("无效的数字。请提供1到28之间的数字。");
             }
             return num;
         }

以上是两个日期范围判定的方法


        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($"参数错误,正确示例:{demo}");
                 return;
             }
 
 
             try
             {
                 using (TaskService taskService = new TaskService())
                 {
                     // 创建一个新任务
                     TaskDefinition taskDefinition = taskService.NewTask();
                     taskDefinition.Principal.UserId = "SYSTEM"; // 设置为SYSTEM以在系统级别运行
                     // 设置任务的基本信息
                     taskDefinition.RegistrationInfo.Description = taskSchedulerConfig.TaskDescription;
 
                     switch (taskSchedulerConfig.TaskExecutionCycle)
                     {
                         case 0:
                             DailyTrigger dailyTrigger = new DailyTrigger();
                             dailyTrigger.StartBoundary = taskSchedulerConfig.StartBoundary;
                             dailyTrigger.DaysInterval = 1; // 每天执行
                             taskDefinition.Triggers.Add(dailyTrigger);
                             break;
                         case 1:
                             WeeklyTrigger weeklyTrigger = new WeeklyTrigger();
                             weeklyTrigger.StartBoundary = taskSchedulerConfig.StartBoundary;
                             weeklyTrigger.DaysOfWeek = GetDaysOfTheWeek(taskSchedulerConfig.DaysOfWeek);
                             weeklyTrigger.WeeksInterval = 1; // 每隔1周执行
                             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; // 每个月执行
                             taskDefinition.Triggers.Add(monthlyTrigger);
                             break;
                         default:
                             Console.WriteLine("任务执行周期参数错误!正确示例:0 每日执行 1 每周执行 2 每月执行");
                             break;
                     }
 
 
 
                     // 设置要执行的程序路径
                     taskDefinition.Actions.Add(new ExecAction(taskSchedulerConfig.ApplicationPath, null, null));
 
                     // 将任务注册到 Windows 任务计划程序
                     taskService.RootFolder.RegisterTaskDefinition(taskSchedulerConfig.TaskName, taskDefinition);
                     Console.WriteLine("任务计划创建成功!");
                 }
             }
             catch (Exception ex)
             {
                 Console.WriteLine($"创建{taskSchedulerConfig.TaskName} 任务错误,错误原因是:{ex.Message}");
             }
 
            
         }
复制代码

 

2024-02-28 16:50:17【出处】:https://www.cnblogs.com/INetIMVC/p/18040041

=======================================================================================

posted on   jack_Meng  阅读(530)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2023-02-28 搭建代理服务器
2023-02-28 用 Visual Studio 升级 .NET 项目
2020-02-28 WPF —— 使用Font-Awesome图标字体
2018-02-28 微信开发系列——微信订阅号前端开发利器:WeUI
2018-02-28 Android - 传统蓝牙通信聊天
2018-02-28 在AD中存取照片
2018-02-28 在IE7+ 中弹出窗口并关闭本身窗口的脚本(备忘)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏

主题色彩