IntervalTrigger.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using System;
  2. using System.Linq;
  3. using System.Threading;
  4. using MediaBrowser.Model.Tasks;
  5. using Microsoft.Extensions.Logging;
  6. namespace Emby.Server.Implementations.ScheduledTasks.Triggers;
  7. /// <summary>
  8. /// Represents a task trigger that runs repeatedly on an interval.
  9. /// </summary>
  10. public sealed class IntervalTrigger : ITaskTrigger, IDisposable
  11. {
  12. private readonly TimeSpan _interval;
  13. private DateTime _lastStartDate;
  14. private Timer? _timer;
  15. private bool _disposed;
  16. /// <summary>
  17. /// Initializes a new instance of the <see cref="IntervalTrigger"/> class.
  18. /// </summary>
  19. /// <param name="interval">The interval.</param>
  20. /// <param name="taskOptions">The options of this task.</param>
  21. public IntervalTrigger(TimeSpan interval, TaskOptions taskOptions)
  22. {
  23. _interval = interval;
  24. TaskOptions = taskOptions;
  25. }
  26. /// <inheritdoc />
  27. public event EventHandler<EventArgs>? Triggered;
  28. /// <inheritdoc />
  29. public TaskOptions TaskOptions { get; }
  30. /// <inheritdoc />
  31. public void Start(TaskResult? lastResult, ILogger logger, string taskName, bool isApplicationStartup)
  32. {
  33. DisposeTimer();
  34. DateTime now = DateTime.UtcNow;
  35. DateTime triggerDate;
  36. if (lastResult is null)
  37. {
  38. // Task has never been completed before
  39. triggerDate = now.AddHours(1);
  40. }
  41. else
  42. {
  43. triggerDate = new[] { lastResult.EndTimeUtc, _lastStartDate, now.AddMinutes(1) }.Max().Add(_interval);
  44. }
  45. var dueTime = triggerDate - now;
  46. var maxDueTime = TimeSpan.FromDays(7);
  47. if (dueTime > maxDueTime)
  48. {
  49. dueTime = maxDueTime;
  50. }
  51. _timer = new Timer(_ => OnTriggered(), null, dueTime, TimeSpan.FromMilliseconds(-1));
  52. }
  53. /// <inheritdoc />
  54. public void Stop()
  55. {
  56. DisposeTimer();
  57. }
  58. /// <summary>
  59. /// Disposes the timer.
  60. /// </summary>
  61. private void DisposeTimer()
  62. {
  63. _timer?.Dispose();
  64. _timer = null;
  65. }
  66. /// <summary>
  67. /// Called when [triggered].
  68. /// </summary>
  69. private void OnTriggered()
  70. {
  71. DisposeTimer();
  72. if (Triggered is not null)
  73. {
  74. _lastStartDate = DateTime.UtcNow;
  75. Triggered(this, EventArgs.Empty);
  76. }
  77. }
  78. /// <inheritdoc />
  79. public void Dispose()
  80. {
  81. if (_disposed)
  82. {
  83. return;
  84. }
  85. DisposeTimer();
  86. _disposed = true;
  87. }
  88. }