From 5b9999eccff26db4f285179ed0b682f46f6dad81 Mon Sep 17 00:00:00 2001 From: Mike Date: Wed, 25 Feb 2015 15:55:01 -0500 Subject: Prototype 2 of max task length for scheduled tasks. --- .../ScheduledTasks/ScheduledTaskWorker.cs | 18 +++++++--- .../ScheduledTasks/TaskManager.cs | 39 ++++++++++++---------- 2 files changed, 35 insertions(+), 22 deletions(-) (limited to 'MediaBrowser.Common.Implementations') diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs index 4d6cc1608..78dcea493 100644 --- a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs @@ -313,7 +313,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks /// /// The source of the event. /// The instance containing the event data. - async void trigger_Triggered(object sender, EventArgs e) + async void trigger_Triggered(object sender, GenericEventArgs e) { var trigger = (ITaskTrigger)sender; @@ -340,11 +340,12 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks /// /// Executes the task /// + /// Task options. /// Task. /// Cannot execute a Task that is already running - public async Task Execute() + public async Task Execute(TaskExecutionOptions options) { - var task = ExecuteInternal(); + var task = ExecuteInternal(options); _currentTask = task; @@ -358,7 +359,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks } } - private async Task ExecuteInternal() + private async Task ExecuteInternal(TaskExecutionOptions options) { // Cancel the current execution, if any if (CurrentCancellationTokenSource != null) @@ -383,7 +384,14 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks try { - await ExecuteTask(CurrentCancellationTokenSource.Token, progress).ConfigureAwait(false); + var localTask = ScheduledTask.Execute(CurrentCancellationTokenSource.Token, progress); + + if (options != null && options.MaxRuntimeMs.HasValue) + { + CurrentCancellationTokenSource.CancelAfter(options.MaxRuntimeMs.Value); + } + + await localTask.ConfigureAwait(false); status = TaskCompletionStatus.Completed; } diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs index 5a3ac53dc..a77efe855 100644 --- a/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs @@ -29,7 +29,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks /// /// The _task queue /// - private readonly List _taskQueue = new List(); + private readonly SortedDictionary _taskQueue = new SortedDictionary(); /// /// Gets or sets the json serializer. @@ -69,13 +69,14 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks /// Cancels if running and queue. /// /// - public void CancelIfRunningAndQueue() + /// Task options. + public void CancelIfRunningAndQueue(TaskExecutionOptions options) where T : IScheduledTask { var task = ScheduledTasks.First(t => t.ScheduledTask.GetType() == typeof(T)); ((ScheduledTaskWorker)task).CancelIfRunning(); - QueueScheduledTask(); + QueueScheduledTask(options); } /// @@ -93,30 +94,33 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks /// Queues the scheduled task. /// /// - public void QueueScheduledTask() + /// Task options + public void QueueScheduledTask(TaskExecutionOptions options) where T : IScheduledTask { var scheduledTask = ScheduledTasks.First(t => t.ScheduledTask.GetType() == typeof(T)); - QueueScheduledTask(scheduledTask); + QueueScheduledTask(scheduledTask, options); } /// /// Queues the scheduled task. /// /// The task. - public void QueueScheduledTask(IScheduledTask task) + /// The task options. + public void QueueScheduledTask(IScheduledTask task, TaskExecutionOptions options) { var scheduledTask = ScheduledTasks.First(t => t.ScheduledTask.GetType() == task.GetType()); - QueueScheduledTask(scheduledTask); + QueueScheduledTask(scheduledTask, options); } /// /// Queues the scheduled task. /// /// The task. - private void QueueScheduledTask(IScheduledTaskWorker task) + /// The task options. + private void QueueScheduledTask(IScheduledTaskWorker task, TaskExecutionOptions options) { var type = task.ScheduledTask.GetType(); @@ -125,17 +129,18 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks // If it's idle just execute immediately if (task.State == TaskState.Idle) { - Execute(task); + Execute(task, options); return; } - if (!_taskQueue.Contains(type)) + if (!_taskQueue.ContainsKey(type)) { Logger.Info("Queueing task {0}", type.Name); - _taskQueue.Add(type); + _taskQueue.Add(type, options); } else { + _taskQueue[type] = options; Logger.Info("Task already queued: {0}", type.Name); } } @@ -181,9 +186,9 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks ((ScheduledTaskWorker)task).Cancel(); } - public Task Execute(IScheduledTaskWorker task) + public Task Execute(IScheduledTaskWorker task, TaskExecutionOptions options) { - return ((ScheduledTaskWorker)task).Execute(); + return ((ScheduledTaskWorker)task).Execute(options); } /// @@ -224,15 +229,15 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks // Execute queued tasks lock (_taskQueue) { - foreach (var type in _taskQueue.ToList()) + foreach (var enqueuedType in _taskQueue.ToList()) { - var scheduledTask = ScheduledTasks.First(t => t.ScheduledTask.GetType() == type); + var scheduledTask = ScheduledTasks.First(t => t.ScheduledTask.GetType() == enqueuedType.Key); if (scheduledTask.State == TaskState.Idle) { - Execute(scheduledTask); + Execute(scheduledTask, enqueuedType.Value); - _taskQueue.Remove(type); + _taskQueue.Remove(enqueuedType.Key); } } } -- cgit v1.2.3