经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Windows » 查看文章
c# 4.8 实现Windows 定时任务计划(Task Scheduler)
来源:cnblogs  作者:我只吃饭不洗碗  时间:2024/3/1 8:45:37  对本文有异议

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

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

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

 

原文链接:https://www.cnblogs.com/INetIMVC/p/18040041

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号