From 5333b72c4fe7f7360b798d2355978be9f46f6553 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Mon, 31 Jul 2017 20:04:12 -0400 Subject: [PATCH] Disposable ITaskManager --- .../Application/ApplicationManagerBase.cs | 2 +- src/GitHub.Api/NewTaskSystem/ITaskManager.cs | 6 ++-- src/GitHub.Api/NewTaskSystem/TaskManager.cs | 34 ++++++++++++++----- .../IntegrationTests/BaseIntegrationTest.cs | 2 +- src/tests/TaskSystemIntegrationTests/Tests.cs | 2 +- 5 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/GitHub.Api/Application/ApplicationManagerBase.cs b/src/GitHub.Api/Application/ApplicationManagerBase.cs index 441f5fb13..6f2a041e2 100644 --- a/src/GitHub.Api/Application/ApplicationManagerBase.cs +++ b/src/GitHub.Api/Application/ApplicationManagerBase.cs @@ -212,7 +212,7 @@ protected virtual void Dispose(bool disposing) { if (disposed) return; disposed = true; - if (TaskManager != null) TaskManager.Stop(); + if (TaskManager != null) TaskManager.Dispose(); if (repositoryManager != null) repositoryManager.Dispose(); } } diff --git a/src/GitHub.Api/NewTaskSystem/ITaskManager.cs b/src/GitHub.Api/NewTaskSystem/ITaskManager.cs index 0b1e151eb..d554d2514 100644 --- a/src/GitHub.Api/NewTaskSystem/ITaskManager.cs +++ b/src/GitHub.Api/NewTaskSystem/ITaskManager.cs @@ -1,9 +1,10 @@ -using System.Threading; +using System; +using System.Threading; using System.Threading.Tasks; namespace GitHub.Unity { - interface ITaskManager + interface ITaskManager : IDisposable { TaskScheduler ConcurrentScheduler { get; } TaskScheduler ExclusiveScheduler { get; } @@ -15,7 +16,6 @@ interface ITaskManager T ScheduleConcurrent(T task) where T : ITask; T ScheduleExclusive(T task) where T : ITask; T ScheduleUI(T task) where T : ITask; - void Stop(); Task Wait(); } } \ No newline at end of file diff --git a/src/GitHub.Api/NewTaskSystem/TaskManager.cs b/src/GitHub.Api/NewTaskSystem/TaskManager.cs index 5073ae54a..dff4e2264 100644 --- a/src/GitHub.Api/NewTaskSystem/TaskManager.cs +++ b/src/GitHub.Api/NewTaskSystem/TaskManager.cs @@ -8,7 +8,7 @@ class TaskManager : ITaskManager { private static readonly ILogging logger = Logging.GetLogger(); - private readonly CancellationTokenSource cts; + private CancellationTokenSource cts; private readonly ConcurrentExclusiveInterleave manager; public TaskScheduler UIScheduler { get; set; } public TaskScheduler ConcurrentScheduler { get { return manager.ConcurrentTaskScheduler; } } @@ -31,12 +31,6 @@ public TaskManager(TaskScheduler uiScheduler) this.UIScheduler = uiScheduler; } - public void Stop() - { - cts.Cancel(); - Wait(); - } - public Task Wait() { return manager.Wait(); @@ -56,7 +50,6 @@ public static TaskScheduler GetScheduler(TaskAffinity affinity) } } - public void Schedule(params ITask[] tasks) { Guard.ArgumentNotNull(tasks, "tasks"); @@ -157,5 +150,30 @@ private T ScheduleConcurrent(T task, bool setupFaultHandler) } return (T)task.Start(manager.ConcurrentTaskScheduler); } + + private void Stop() + { + if (cts == null) + throw new ObjectDisposedException(nameof(TaskManager)); + cts.Cancel(); + Wait(); + cts = null; + } + + private bool disposed = false; + private void Dispose(bool disposing) + { + if (disposed) return; + disposed = true; + if (disposing) + { + Stop(); + } + } + + public void Dispose() + { + Dispose(true); + } } } \ No newline at end of file diff --git a/src/tests/IntegrationTests/BaseIntegrationTest.cs b/src/tests/IntegrationTests/BaseIntegrationTest.cs index 7ed9cc6fe..8dee89a8d 100644 --- a/src/tests/IntegrationTests/BaseIntegrationTest.cs +++ b/src/tests/IntegrationTests/BaseIntegrationTest.cs @@ -40,7 +40,7 @@ public virtual void OnSetup() [TearDown] public virtual void OnTearDown() { - TaskManager.Instance?.Stop(); + TaskManager.Instance?.Dispose(); Logger.Debug("Deleting TestBasePath: {0}", TestBasePath.ToString()); for (var i = 0; i < 5; i++) { diff --git a/src/tests/TaskSystemIntegrationTests/Tests.cs b/src/tests/TaskSystemIntegrationTests/Tests.cs index f65354a71..97647db89 100644 --- a/src/tests/TaskSystemIntegrationTests/Tests.cs +++ b/src/tests/TaskSystemIntegrationTests/Tests.cs @@ -56,7 +56,7 @@ public void OneTimeSetup() [TestFixtureTearDown] public void OneTimeTearDown() { - TaskManager?.Stop(); + TaskManager?.Dispose(); try { TestBasePath.DeleteIfExists();