//****************************************************************************************************** // CancellationToken.cs - Gbtc // // Copyright © 2016, Grid Protection Alliance. All Rights Reserved. // // Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See // the NOTICE file distributed with this work for additional information regarding copyright ownership. // The GPA licenses this file to you under the MIT License (MIT), the "License"; you may // not use this file except in compliance with the License. You may obtain a copy of the License at: // // http://opensource.org/licenses/MIT // // Unless agreed to in writing, the subject software distributed under the License is distributed on an // "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the // License for the specific language governing permissions and limitations. // // Code Modification History: // ---------------------------------------------------------------------------------------------------- // 01/29/2016 - Stephen C. Wills // Generated original version of source code. // 09/13/2016 - J. Ritchie Carroll // Updated to include cancellation event and implicit conversion to system cancellation tokens. // //****************************************************************************************************** using System; using System.Threading; namespace GSF.Threading { /// /// Represents a token that can be used to cancel an asynchronous operation. /// public class CancellationToken : ICancellationToken { #region [ Members ] // Events /// /// Event that will be raised when this is cancelled. /// public event EventHandler Cancelled; // Fields private int m_cancelled; #endregion #region [ Properties ] /// /// Gets a value that indicates whether the operation has been cancelled. /// public bool IsCancelled => Interlocked.CompareExchange(ref m_cancelled, 0, 0) != 0; #endregion #region [ Methods ] /// /// Cancels the operation. /// /// true if the operation was cancelled; otherwise false. public bool Cancel() { bool result = Interlocked.Exchange(ref m_cancelled, 1) == 0; if (result && (object)Cancelled != null) Cancelled(this, EventArgs.Empty); return result; } #endregion #region [ Operators ] /// /// Implicitly converts a GSF cancellation token to an associated . /// /// Existing GSF cancellation token that is converted to an associated . /// A based on an existing GSF cancellation token. public static implicit operator System.Threading.CancellationToken(CancellationToken token) { return new CompatibleCancellationToken(token).GetToken(); } /// /// Implicitly converts a GSF cancellation token to an associated . /// /// Existing GSF cancellation token that is converted to an associated . /// A based on an existing GSF cancellation token. public static implicit operator CancellationTokenSource(CancellationToken token) { return new CompatibleCancellationToken(token).GetTokenSource(); } #endregion } }