登录 / 注册
C#定点任务代码 类似Windows计划任务(健壮性高)
发布时间:2018-11-14 15:49:46 查看:3372

C#只提供Timer定时器(C++ SetTimer 类似),通过设置一个时间间隔来定时触发执行任务。那么定点执行任务怎么实现呢?


原理:每次通过计算得出下次定点任务与现在时点的事件间隔,作为Timer的时间间隔,从而实现任务的定点执行。原理比较简单,代码中都有注释,有类似需求的童鞋可以直接用作项目中,免测试哦~~~
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.Linq;
  7. using System.ServiceProcess;
  8. using System.Text;
  9. using System.Timers;
  10. namespace PlanDemoService
  11. {
  12. public partial class Service1 : ServiceBase
  13. {
  14. public Service1()
  15. {
  16. InitializeComponent();
  17. }
  18. // 每天执行一次的时间点(最好写在配置中,这里为了方便展示)
  19. private string onceDoStr = "18:00";
  20. private DateTime onceDoTime;
  21. // 定时执行一次
  22. private Timer onceDoTimer = new Timer();
  23. /// <summary>
  24. /// 定时器触发事件
  25. /// </summary>
  26. /// <param name="sender"></param>
  27. /// <param name="e"></param>
  28. private void OnceDoTimer_Elapsed(object sender, ElapsedEventArgs e)
  29. {
  30. UpdateOnceDoTimePeriod();
  31. // 更新下次执行间隔
  32. SetNextOnceDoInterval();
  33. if (DateTime.Now.ToString("HH:mm").CompareTo(onceDoStr.Trim()) >= 0)
  34. {
  35. // 可能由于系统原因导致触发过早的,不执行
  36. onceDoMain();
  37. }
  38. }
  39. /// <summary>
  40. /// 设置定时器间隔时间
  41. /// </summary>
  42. private void SetNextOnceDoInterval()
  43. {
  44. TimeSpan spanNextDay = new TimeSpan(1, 0, 0, 0);
  45. if (DateTime.Now < onceDoTime)
  46. {
  47. onceDoTimer.Interval = (onceDoTime - DateTime.Now).TotalMilliseconds;
  48. Loger.Log(string.Format("定时任务将于{0}执行一次。", onceDoTime.ToString("yyyy-MM-dd HH:mm:ss")), "PlanDemoService");
  49. }
  50. if (DateTime.Now > onceDoTime)
  51. {
  52. onceDoTimer.Interval = (onceDoTime + spanNextDay - DateTime.Now).TotalMilliseconds;
  53. Loger.Log(string.Format("下次定时任务将于{0}执行一次。", (onceDoTime + spanNextDay).ToString("yyyy-MM-dd HH:mm:ss")), "PlanDemoService");
  54. }
  55. }
  56. /// <summary>
  57. /// 更新任务触发时间(按每天最新日期)
  58. /// </summary>
  59. private void UpdateOnceDoTimePeriod()
  60. {
  61. string[] parts = onceDoStr.Split(':');
  62. onceDoTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day,
  63. int.Parse(parts[0]), int.Parse(parts[1]), 0);
  64. }
  65. /// <summary>
  66. /// 任务执行
  67. /// </summary>
  68. private void onceDoMain()
  69. {
  70. Loger.Log("任务执行!", "PlanDemoService");
  71. }
  72. protected override void OnStart(string[] args)
  73. {
  74. try
  75. {
  76. UpdateOnceDoTimePeriod();
  77. }
  78. catch (Exception e)
  79. {
  80. Loger.Log("时间配置有误!" + e.Message, "PlanDemoService");
  81. throw e;
  82. }
  83. onceDoTimer.Elapsed += new ElapsedEventHandler(OnceDoTimer_Elapsed);
  84. SetNextOnceDoInterval();
  85. onceDoTimer.Start();
  86. }
  87. protected override void OnStop()
  88. {
  89. onceDoTimer.Stop();
  90. Loger.Log("服务已停止!", "PlanDemoService");
  91. }
  92. }
  93. }

https://blog.csdn.net/zqp2013/article/details/47419619

宁夏银川舜新艺软件开发
ShunXinyi Soft develop
主要经营
软件开发,网站制作,网页设计,移动应用(安卓、苹果),微信,微网站,
FLASH动画,电子商务,计算机软硬件及网络设备等。
电话:18695132945 QQ:23923027
舜新艺软件开发 宁ICP备16001093号-1 宁公网安备 64010602000809号