From 7773862facd1e58137257726a96b680718b2aa06 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 27 Mar 2015 00:17:04 -0400 Subject: fix subtitle syncing --- .../ScheduledTasks/TaskManager.cs | 37 ++++++++++++---------- 1 file changed, 20 insertions(+), 17 deletions(-) (limited to 'MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs') diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs index 4f84652c6..de7987bd2 100644 --- a/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs @@ -6,6 +6,7 @@ using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Tasks; using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -29,7 +30,8 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks /// /// The _task queue /// - private readonly SortedDictionary _taskQueue = new SortedDictionary(); + private readonly ConcurrentQueue> _taskQueue = + new ConcurrentQueue>(); /// /// Gets or sets the json serializer. @@ -136,25 +138,17 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks { var type = task.ScheduledTask.GetType(); + Logger.Info("Queueing task {0}", type.Name); + lock (_taskQueue) { - // If it's idle just execute immediately if (task.State == TaskState.Idle) { Execute(task, options); return; } - if (!_taskQueue.ContainsKey(type)) - { - Logger.Info("Queueing task {0}", type.Name); - _taskQueue.Add(type, options); - } - else - { - _taskQueue[type] = options; - Logger.Info("Task already queued: {0}", type.Name); - } + _taskQueue.Enqueue(new Tuple(type, options)); } } @@ -241,15 +235,24 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks // Execute queued tasks lock (_taskQueue) { - foreach (var enqueuedType in _taskQueue.ToList()) + var list = new List>(); + + Tuple item; + while (_taskQueue.TryDequeue(out item)) { - var scheduledTask = ScheduledTasks.First(t => t.ScheduledTask.GetType() == enqueuedType.Key); + if (list.All(i => i.Item1 != item.Item1)) + { + list.Add(item); + } + } + + foreach (var enqueuedType in list) + { + var scheduledTask = ScheduledTasks.First(t => t.ScheduledTask.GetType() == enqueuedType.Item1); if (scheduledTask.State == TaskState.Idle) { - Execute(scheduledTask, enqueuedType.Value); - - _taskQueue.Remove(enqueuedType.Key); + Execute(scheduledTask, enqueuedType.Item2); } } } -- cgit v1.2.3