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刚遇到。