namespace System.Threading; public struct CancellationToken { private static readonly WaitHandle InfiniteWaitHandle = new ManualResetEvent(initialState: false); private CancellationTokenSource? source; public bool IsCancellationRequested => source?.IsCancellationRequested ?? false; public WaitHandle WaitHandle => source?.WaitHandle ?? InfiniteWaitHandle; internal CancellationToken(CancellationTokenSource source) { this.source = source; } public CancellationTokenRegistration Register(Action action) { return source?.Register(action) ?? default(CancellationTokenRegistration); } public override bool Equals(object? obj) { if (obj is CancellationToken cancellationToken) { return Equals(cancellationToken); } return false; } public bool Equals(CancellationToken cancellationToken) { return source == cancellationToken.source; } public override int GetHashCode() { return source?.GetHashCode() ?? 0; } public static bool operator ==(CancellationToken left, CancellationToken right) { return left.Equals(right); } public static bool operator !=(CancellationToken left, CancellationToken right) { return !(left == right); } }