From bc068b201d4b937e4ead37df2c10d212f1dc635a Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 4 Feb 2015 15:12:37 +1100 Subject: [PATCH] Updates BackgroundTaskRunner to ensure canceled or skipped tasks are disposed, updated tests to reflect --- .../Scheduling/BackgroundTaskRunnerTests.cs | 22 ++++++++++------ .../Scheduling/BackgroundTaskRunner.cs | 26 ++++--------------- .../Scheduling/BackgroundTaskRunnerOptions.cs | 23 ++++++++++++++++ src/Umbraco.Web/Umbraco.Web.csproj | 1 + 4 files changed, 43 insertions(+), 29 deletions(-) create mode 100644 src/Umbraco.Web/Scheduling/BackgroundTaskRunnerOptions.cs diff --git a/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs b/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs index 3e851a68f0..11ba81b585 100644 --- a/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs +++ b/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs @@ -273,22 +273,25 @@ namespace Umbraco.Tests.Scheduling { } - public override void Run() + public override void PerformRun() { Thread.Sleep(500); } - public override void Cancel() - { - - } } public abstract class BaseTask : IBackgroundTask { + public bool WasCancelled { get; set; } + public Guid UniqueId { get; protected set; } - public abstract void Run(); + public abstract void PerformRun(); + public void Run() + { + PerformRun(); + Ended = DateTime.Now; + } public Task RunAsync() { throw new NotImplementedException(); @@ -299,7 +302,10 @@ namespace Umbraco.Tests.Scheduling get { return false; } } - public abstract void Cancel(); + public virtual void Cancel() + { + WasCancelled = true; + } public DateTime Queued { get; set; } public DateTime Started { get; set; } @@ -307,7 +313,7 @@ namespace Umbraco.Tests.Scheduling public virtual void Dispose() { - Ended = DateTime.Now; + } } diff --git a/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs b/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs index d11ff03d66..ffba7a1e0a 100644 --- a/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs +++ b/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs @@ -8,26 +8,6 @@ using Umbraco.Core.Logging; namespace Umbraco.Web.Scheduling { - - internal class BackgroundTaskRunnerOptions - { - public BackgroundTaskRunnerOptions() - { - DedicatedThread = false; - PersistentThread = false; - OnlyProcessLastItem = false; - } - - public bool DedicatedThread { get; set; } - public bool PersistentThread { get; set; } - - /// - /// If this is true, the task runner will skip over all items and only process the last/final - /// item registered - /// - public bool OnlyProcessLastItem { get; set; } - } - /// /// This is used to create a background task runner which will stay alive in the background of and complete /// any tasks that are queued. It is web aware and will ensure that it is shutdown correctly when the app domain @@ -174,7 +154,8 @@ namespace Umbraco.Web.Scheduling //skip if this is not the last if (_options.OnlyProcessLastItem && _tasks.Count > 0) { - //NOTE: don't raise canceled event, we're shutting down + //NOTE: don't raise canceled event, we're shutting down, just dispose + remainingTask.Dispose(); continue; } @@ -372,6 +353,9 @@ namespace Umbraco.Web.Scheduling { var handler = TaskCancelled; if (handler != null) handler(this, e); + + //dispose it + e.Task.Dispose(); } diff --git a/src/Umbraco.Web/Scheduling/BackgroundTaskRunnerOptions.cs b/src/Umbraco.Web/Scheduling/BackgroundTaskRunnerOptions.cs new file mode 100644 index 0000000000..c42fcd681a --- /dev/null +++ b/src/Umbraco.Web/Scheduling/BackgroundTaskRunnerOptions.cs @@ -0,0 +1,23 @@ +namespace Umbraco.Web.Scheduling +{ + internal class BackgroundTaskRunnerOptions + { + //TODO: Could add options for using a stack vs queue if required + + public BackgroundTaskRunnerOptions() + { + DedicatedThread = false; + PersistentThread = false; + OnlyProcessLastItem = false; + } + + public bool DedicatedThread { get; set; } + public bool PersistentThread { get; set; } + + /// + /// If this is true, the task runner will skip over all items and only process the last/final + /// item registered + /// + public bool OnlyProcessLastItem { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 8cd6f55046..23ba69cf31 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -498,6 +498,7 @@ +