Unity_ET-TimerComponent
源码:
namespace ETModel
{public struct Timer{public long Id { get; set; }public long Time { get; set; }public TaskCompletionSource<bool> tcs;}[ObjectSystem]public class TimerComponentUpdateSystem : UpdateSystem<TimerComponent>{public override void Update(TimerComponent self){self.Update();}}public class TimerComponent : Component{private readonly Dictionary<long, Timer> timers = new Dictionary<long, Timer>();/// <summary>/// key: time, value: timer id/// </summary>private readonly MultiMap<long, long> timeId = new MultiMap<long, long>();private readonly Queue<long> timeOutTime = new Queue<long>();private readonly Queue<long> timeOutTimerIds = new Queue<long>();// 记录最小时间,不用每次都去MultiMap取第一个值private long minTime;public void Update(){if (this.timeId.Count == 0){return;}long timeNow = TimeHelper.Now();if (timeNow < this.minTime){return;}foreach (KeyValuePair<long, List<long>> kv in this.timeId.GetDictionary()){long k = kv.Key;if (k > timeNow){minTime = k;break;}this.timeOutTime.Enqueue(k);}while(this.timeOutTime.Count > 0){long time = this.timeOutTime.Dequeue();foreach(long timerId in this.timeId[time]){this.timeOutTimerIds.Enqueue(timerId); }this.timeId.Remove(time);}while(this.timeOutTimerIds.Count > 0){long timerId = this.timeOutTimerIds.Dequeue();Timer timer;if (!this.timers.TryGetValue(timerId, out timer)){continue;}this.timers.Remove(timerId);timer.tcs.SetResult(true);}}private void Remove(long id){Timer timer;if (!this.timers.TryGetValue(id, out timer)){return;}this.timers.Remove(id);}public Task WaitTillAsync(long tillTime, CancellationToken cancellationToken){TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();Timer timer = new Timer { Id = IdGenerater.GenerateId(), Time = tillTime, tcs = tcs };this.timers[timer.Id] = timer;this.timeId.Add(timer.Time, timer.Id);if (timer.Time < this.minTime){this.minTime = timer.Time;}cancellationToken.Register(() => { this.Remove(timer.Id); });return tcs.Task;}public Task WaitTillAsync(long tillTime){TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();Timer timer = new Timer { Id = IdGenerater.GenerateId(), Time = tillTime, tcs = tcs };this.timers[timer.Id] = timer;this.timeId.Add(timer.Time, timer.Id);if (timer.Time < this.minTime){this.minTime = timer.Time;}return tcs.Task;}public Task WaitAsync(long time, CancellationToken cancellationToken){TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();Timer timer = new Timer { Id = IdGenerater.GenerateId(), Time = TimeHelper.Now() + time, tcs = tcs };this.timers[timer.Id] = timer;this.timeId.Add(timer.Time, timer.Id);if (timer.Time < this.minTime){this.minTime = timer.Time;}cancellationToken.Register(() => { this.Remove(timer.Id); });return tcs.Task;}public Task WaitAsync(long time){TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();Timer timer = new Timer { Id = IdGenerater.GenerateId(), Time = TimeHelper.Now() + time, tcs = tcs };this.timers[timer.Id] = timer;this.timeId.Add(timer.Time, timer.Id);if (timer.Time < this.minTime){this.minTime = timer.Time;}return tcs.Task;}}
}
1. 首先定义了结构体:
2. 时间组件更新系统?
没太明白[ObjectSystem]的具体作用,网络有以下说法:
3. 变量
4. 方法:
5. 关于TimerComponent是什么,网上的回答:
一般定时任务的实现TimerComponent实现的吗?有待继续研究,只知道通过mq定时收发接收消息。TimerComponent刚遇到。