using System; using System.Threading; using System.Threading.Tasks; using Umbraco.Core; namespace Umbraco.Web.Scheduling { internal abstract class LatchedBackgroundTaskBase : DisposableObject, ILatchedBackgroundTask { private readonly ManualResetEventSlim _latch; protected LatchedBackgroundTaskBase() { _latch = new ManualResetEventSlim(false); } /// /// Implements IBackgroundTask.Run(). /// public abstract void Run(); /// /// Implements IBackgroundTask.RunAsync(). /// public abstract Task RunAsync(CancellationToken token); /// /// Indicates whether the background task can run asynchronously. /// public abstract bool IsAsync { get; } public WaitHandle Latch { get { return _latch.WaitHandle; } } public bool IsLatched { get { return _latch.IsSet == false; } } protected void Release() { _latch.Set(); } protected void Reset() { _latch.Reset(); } public abstract bool RunsOnShutdown { get; } // the task is going to be disposed after execution, // unless it is latched again, thus indicating it wants to // remain active protected override void DisposeResources() { _latch.Dispose(); } } }