Framework_YooAsset_HybridCLR/Assets/DemoGame/GameScript/Hotfix/Pool/TokenInfo.cs

84 lines
2.1 KiB
C#

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<Action> callbacks;
public int id => this._id;
public CancellationTokenSource ets => this._ets;
public CancellationToken token => this._ets.Token;
public bool isDispose => this._isDispose;
public Action<TokenInfo> DisposeAction;
public TokenInfo(int id)
{
this._id = id;
this.callbacks = new List<Action>();
}
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);
}
}
}