DailyTrigger.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System;
  2. using System.Threading;
  3. using MediaBrowser.Model.Tasks;
  4. using Microsoft.Extensions.Logging;
  5. namespace Emby.Server.Implementations.ScheduledTasks.Triggers;
  6. /// <summary>
  7. /// Represents a task trigger that fires everyday.
  8. /// </summary>
  9. public sealed class DailyTrigger : ITaskTrigger, IDisposable
  10. {
  11. private readonly TimeSpan _timeOfDay;
  12. private Timer? _timer;
  13. private bool _disposed;
  14. /// <summary>
  15. /// Initializes a new instance of the <see cref="DailyTrigger"/> class.
  16. /// </summary>
  17. /// <param name="timeOfDay">The time of day to trigger the task to run.</param>
  18. /// <param name="taskOptions">The options of this task.</param>
  19. public DailyTrigger(TimeSpan timeOfDay, TaskOptions taskOptions)
  20. {
  21. _timeOfDay = timeOfDay;
  22. TaskOptions = taskOptions;
  23. }
  24. /// <inheritdoc />
  25. public event EventHandler<EventArgs>? Triggered;
  26. /// <inheritdoc />
  27. public TaskOptions TaskOptions { get; }
  28. /// <inheritdoc />
  29. public void Start(TaskResult? lastResult, ILogger logger, string taskName, bool isApplicationStartup)
  30. {
  31. DisposeTimer();
  32. var now = DateTime.Now;
  33. var triggerDate = now.TimeOfDay > _timeOfDay ? now.Date.AddDays(1) : now.Date;
  34. triggerDate = triggerDate.Add(_timeOfDay);
  35. var dueTime = triggerDate - now;
  36. logger.LogInformation("Daily trigger for {Task} set to fire at {TriggerDate:yyyy-MM-dd HH:mm:ss.fff zzz}, which is {DueTime:c} from now.", taskName, triggerDate, dueTime);
  37. _timer = new Timer(_ => OnTriggered(), null, dueTime, TimeSpan.FromMilliseconds(-1));
  38. }
  39. /// <inheritdoc />
  40. public void Stop()
  41. {
  42. DisposeTimer();
  43. }
  44. /// <summary>
  45. /// Disposes the timer.
  46. /// </summary>
  47. private void DisposeTimer()
  48. {
  49. _timer?.Dispose();
  50. _timer = null;
  51. }
  52. /// <summary>
  53. /// Called when [triggered].
  54. /// </summary>
  55. private void OnTriggered()
  56. {
  57. Triggered?.Invoke(this, EventArgs.Empty);
  58. }
  59. /// <inheritdoc />
  60. public void Dispose()
  61. {
  62. if (_disposed)
  63. {
  64. return;
  65. }
  66. DisposeTimer();
  67. _disposed = true;
  68. }
  69. }