using System; using System.Threading; using System.Threading.Tasks; using Umbraco.Core; namespace Umbraco.Web.Scheduling { public abstract class LatchedBackgroundTaskBase : DisposableObjectSlim, ILatchedBackgroundTask { private TaskCompletionSource _latch; protected LatchedBackgroundTaskBase() { _latch = new TaskCompletionSource(); } /// /// Implements IBackgroundTask.Run(). /// public virtual void Run() { throw new NotSupportedException("This task cannot run synchronously."); } /// /// Implements IBackgroundTask.RunAsync(). /// public virtual Task RunAsync(CancellationToken token) { throw new NotSupportedException("This task cannot run asynchronously."); } /// /// Indicates whether the background task can run asynchronously. /// public abstract bool IsAsync { get; } public Task Latch => _latch.Task; public bool IsLatched => _latch.Task.IsCompleted == false; protected void Release() { _latch.SetResult(true); } protected void Reset() { _latch = new TaskCompletionSource(); } public virtual bool RunsOnShutdown => false; // 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() { } } }