//******************************************************************************************************
// 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
}
}