v10.10.2024.0701 使用IJsonHost改进Json序列化
大石头 编写于 2024-07-01 08:36:34 大石头 提交于 2024-07-01 08:48:33
X
using System.Diagnostics;

namespace System.Threading;

[DebuggerDisplay("IsCancellationRequested = {IsCancellationRequested}")]
public struct CancellationToken
{
	private readonly CancellationTokenSource source;

	public static CancellationToken None => default(CancellationToken);

	public bool CanBeCanceled => source != null;

	public bool IsCancellationRequested => Source.IsCancellationRequested;

	public WaitHandle WaitHandle => Source.WaitHandle;

	private CancellationTokenSource Source => source ?? CancellationTokenSource.NoneSource;

	public CancellationToken(bool canceled)
		: this(canceled ? CancellationTokenSource.CanceledSource : null)
	{
	}

	internal CancellationToken(CancellationTokenSource source)
	{
		this.source = source;
	}

	public CancellationTokenRegistration Register(Action callback)
	{
		return Register(callback, useSynchronizationContext: false);
	}

	public CancellationTokenRegistration Register(Action callback, bool useSynchronizationContext)
	{
		if (callback == null)
		{
			throw new ArgumentNullException("callback");
		}
		return Source.Register(callback, useSynchronizationContext);
	}

	public CancellationTokenRegistration Register(Action<object> callback, object state)
	{
		return Register(callback, state, useSynchronizationContext: false);
	}

	public CancellationTokenRegistration Register(Action<object> callback, object state, bool useSynchronizationContext)
	{
		if (callback == null)
		{
			throw new ArgumentNullException("callback");
		}
		return Register(delegate
		{
			callback(state);
		}, useSynchronizationContext);
	}

	public void ThrowIfCancellationRequested()
	{
		if (Source.IsCancellationRequested)
		{
            //throw new OperationCanceledException(this);
            throw new OperationCanceledException();
        }
    }

	public bool Equals(CancellationToken other)
	{
		return Source == other.Source;
	}

	public override bool Equals(object other)
	{
		if (!(other is CancellationToken))
		{
			return false;
		}
		return Equals((CancellationToken)other);
	}

	public override int GetHashCode()
	{
		return Source.GetHashCode();
	}

	public static bool operator ==(CancellationToken left, CancellationToken right)
	{
		return left.Equals(right);
	}

	public static bool operator !=(CancellationToken left, CancellationToken right)
	{
		return !left.Equals(right);
	}
}