using Sarand.Net.Standard.Base.Core; using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace Sarand.Net.Standard.Base.Tasks { //======================================================================= public class SacsTaskData : SacsDisposable { //------------------------------------------------------------------- // Data members. // Cancellation token source - allows task cancellation to be triggered // if the cancellation token wasn't supplied on construction. private CancellationTokenSource cancellationTokenSource = null; //------------------------------------------------------------------- // Construction. public SacsTaskData (CancellationToken? cancellationToken = null) { if (cancellationToken != null) { // Cancell token supplied on construction // - cancellation is controlled by a higher level task. CancellationToken = (CancellationToken)cancellationToken; } else { // Cancellation token not supplied - cancellation can be triggered here. cancellationTokenSource = new CancellationTokenSource(); CancellationToken = cancellationTokenSource.Token; } } protected override void Dispose (bool disposing) { if (disposing) { if (cancellationTokenSource != null) { cancellationTokenSource.Cancel(); cancellationTokenSource.Dispose(); } cancellationTokenSource = null; } } //------------------------------------------------------------------- // Properties. public bool Debug { get; set; } /// Token to allow the async request to be cancelled. public CancellationToken CancellationToken { get; } //------------------------------------------------------------------- // C a n c e l l a t i o n //------------------------------------------------------------------- /// Gets whether cancellation has been requested. public bool IsCancellationRequested { get { return CancellationToken.IsCancellationRequested; } } /// Throws a System.OperationCanceledException if this token has had cancellation requested. public void ThrowIfCancellationRequested() { CancellationToken.ThrowIfCancellationRequested(); } /// Can cancellation be triggered here? public bool CanBeCancelled { get { return cancellationTokenSource != null; } } public bool TriggerCancellation () { if (!CanBeCancelled) return false; cancellationTokenSource.Cancel(); return true; } //------------------------------------------------------------------- } //======================================================================= }