using MediaBrowser.Common.Kernel; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Tasks; using System; using System.Collections.Generic; using System.Linq; namespace MediaBrowser.Common.ScheduledTasks { /// /// Class TaskManager /// public class TaskManager : BaseManager { /// /// The _task queue /// private readonly List _taskQueue = new List(); /// /// The _logger /// private readonly ILogger _logger; /// /// Initializes a new instance of the class. /// /// The kernel. /// The logger. public TaskManager(IKernel kernel, ILogger logger) : base(kernel) { _logger = logger; } /// /// Cancels if running and queue. /// /// public void CancelIfRunningAndQueue() where T : IScheduledTask { Kernel.ScheduledTasks.OfType().First().CancelIfRunning(); QueueScheduledTask(); } /// /// Queues the scheduled task. /// /// public void QueueScheduledTask() where T : IScheduledTask { var scheduledTask = Kernel.ScheduledTasks.OfType().First(); QueueScheduledTask(scheduledTask); } /// /// Queues the scheduled task. /// /// The task. public void QueueScheduledTask(IScheduledTask task) { var type = task.GetType(); var scheduledTask = Kernel.ScheduledTasks.First(t => t.GetType() == type); lock (_taskQueue) { // If it's idle just execute immediately if (scheduledTask.State == TaskState.Idle) { scheduledTask.Execute(); return; } if (!_taskQueue.Contains(type)) { _logger.Info("Queueing task {0}", type.Name); _taskQueue.Add(type); } else { _logger.Info("Task already queued: {0}", type.Name); } } } /// /// Called when [task completed]. /// /// The task. internal void OnTaskCompleted(IScheduledTask task) { // Execute queued tasks lock (_taskQueue) { var copy = _taskQueue.ToList(); foreach (var type in copy) { var scheduledTask = Kernel.ScheduledTasks.First(t => t.GetType() == type); if (scheduledTask.State == TaskState.Idle) { scheduledTask.Execute(); _taskQueue.Remove(type); } } } } } }