ScheduledTimeTask.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using JLHHJSvr.LJException;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using System.Threading;
  6. namespace JLHHJSvr.Tools
  7. {
  8. public class ScheduledTimeTask
  9. {
  10. public string Name { get; }
  11. public TimeSpan RunAt { get; }
  12. public Action TaskAction { get; }
  13. private Timer _timer;
  14. public ScheduledTimeTask(string name, TimeSpan runAt, Action action)
  15. {
  16. Name = name;
  17. RunAt = runAt;
  18. TaskAction = action;
  19. ScheduleNext();
  20. }
  21. private void ScheduleNext()
  22. {
  23. var now = DateTime.Now;
  24. var nextRun = DateTime.Today.Add(RunAt);
  25. // 下一天执行
  26. if (now > nextRun) nextRun = nextRun.AddDays(1);
  27. var timeToGo = nextRun - now;
  28. _timer = new Timer(_ =>
  29. {
  30. Trace.Write($"{Name}定时任务执行!!!");
  31. TaskAction.Invoke();
  32. ScheduleNext(); // 再次调度
  33. }, null, timeToGo, Timeout.InfiniteTimeSpan);
  34. }
  35. public void Stop() => _timer?.Dispose();
  36. }
  37. public class DailySchedulerManager
  38. {
  39. private readonly Dictionary<string, ScheduledTimeTask> _tasks = new Dictionary<string, ScheduledTimeTask>();
  40. public void AddTask(string name, TimeSpan runAt, Action action)
  41. {
  42. if (_tasks.ContainsKey(name)) throw new LJCommonException($"任务 \"{name}\" 已存在");
  43. _tasks[name] = new ScheduledTimeTask(name, runAt, action);
  44. }
  45. public void RemoveTask(string name)
  46. {
  47. if (_tasks.TryGetValue(name, out var task))
  48. {
  49. task.Stop();
  50. _tasks.Remove(name);
  51. }
  52. }
  53. public void StopAll()
  54. {
  55. foreach (var task in _tasks.Values) task.Stop();
  56. _tasks.Clear();
  57. }
  58. }
  59. }