using System; using System.Collections.Generic; using System.Threading; namespace ZC { public interface ITokenInfo { public int id { get; } public bool isDispose { get; } public CancellationTokenSource ets { get; } public CancellationToken token { get; } public void Add(Action callback); public void Remove(Action callback); public void Cancel(); public void Dispose(); } public class TokenInfo : ITokenInfo { private int _id; public bool _isDispose; private CancellationTokenSource _ets; private List callbacks; public int id => this._id; public CancellationTokenSource ets => this._ets; public CancellationToken token => this._ets.Token; public bool isDispose => this._isDispose; public Action DisposeAction; public TokenInfo(int id) { this._id = id; this.callbacks = new List(); } public void Init() { this._ets = new CancellationTokenSource(); this._ets.Token.Register(this.Callback); this._isDispose = false; } private void Callback() { if (this.callbacks.Count > 0) foreach (var callback in this.callbacks) { callback?.Invoke(); } } public void Add(Action callback) { this.callbacks.Add(callback); } public void Remove(Action callback) { if (this.callbacks.Contains(callback)) this.callbacks.Remove(callback); } public void Cancel() { this._ets.Cancel(); this.Dispose(); } public void Dispose() { if (this._isDispose) return; this._id = 0; this._ets.Dispose(); this.callbacks.Clear(); this._ets = null; this._isDispose = true; this.DisposeAction?.Invoke(this); } } }