using MediaBrowser.Common.Kernel; 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(); /// /// Initializes a new instance of the class. /// /// The kernel. public TaskManager(IKernel kernel) : base(kernel) { } /// /// 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); } } } } } }