Unity_ET-TimerComponent

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/265670.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Facebook广告投放常见错误

在进行Facebook广告投放时&#xff0c;很容易犯一些常见的错误。这些错误可能导致广告投资的浪费&#xff0c;影响广告效果并降低回报。本文小编讲一些常见的Facebook广告投放错误&#xff0c;以及如何避免它们。 1、不明确目标受众 广告的成功与否很大程度上取决于你选择的目…

6-9 求一元函数定积分

一元函数f(x)在区间[a,b]上定积分∫ab​f(x)dx的几何意义是被积函数与横坐标轴以及直线xa和直线xb围成的曲边形的面积。依据几何意义求定积分的方法是将这个区域按x轴方向等分成若干个细小的条状区域&#xff0c;每个小区域近似于一个梯形(如图所示)&#xff0c;计算出所有小梯…

mycat部署和配置读写分离(二)

说明&#xff1a; MyCAT 是使用 JAVA 语言进行编写开发&#xff0c;使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性&#xff0c;所以要求必须在 JDK7 以上的版本上运行。 1. jdk1.8安装 详见jdk环境安装 2. Mysql安装 详见mysql8.0.11源码安装…

pycharm手动安装包

1.下载对应的包 TTS PyPI 2.手动解压&#xff0c;找到文件放到pycharm对应项目的lib文件夹中 以TTS包为例&#xff0c;找到下载并解压的包中的2个文件&#xff0c;一个名称一个info结尾 3.放到项目的lib文件夹中 eg&#xff1a;路径&#xff1b;C:\doc\myProject\speaker\venv…

工业级路由器在货运物流仓储管理中的应用

工业级路由器在货运物流仓储管理中扮演着重要的角色&#xff0c;为整个物流系统提供了稳定可靠的网络连接和数据传输支持。下面将从以下几个方面介绍工业级路由器在货运物流仓储管理中的应用。 实时监控和追踪&#xff1a;工业级路由器通过与各种传感器、监控设备和物联网设备的…

亚马逊云科技Amazon Bedrock,现推出更多模型选择和全新强大功能

亚马逊云科技在re:Invent 2023上宣布推出Amazon Bedrock更多模型选择和强大功能&#xff0c;帮助客户更轻松地构建和规模化针对其业务定制的生成式AI应用程序。 Amazon Bedrock是一项全面托管的服务&#xff0c;用户可轻松访问来自AI21 Labs、Anthropic、Cohere、Meta、Stabili…

Word插件-好用的插件-一键标记-大珩助手

一键标记 在审阅重要文件时&#xff0c;需要将重点的信息标记出来&#xff0c;这些重点信息有一些具有相似性&#xff0c;比如甲方、地址、要求、必续等等&#xff0c;以避免遗漏重要内容&#xff0c;由此设计一个可一次标记多个关键字的标记工具 使用方法 关键字之间用逗号“…

PO模式在selenium自动化测试框架有什么好处

PO模式是在UI自动化测试过程当中使用非常频繁的一种设计模式&#xff0c;使用这种模式后&#xff0c;可以有效的提升代码的复用能力&#xff0c;并且让自动化测试代码维护起来更加方便。 PO模式的全称叫page object model&#xff08;POM&#xff09;&#xff0c;有时候叫做 p…

移动端原生实现列表列固定横向滚动功能

功能介绍&#xff1a; 在移动端开发中&#xff0c;会用到列表作为信息展示方式&#xff0c;一般希望上下滚动时&#xff0c;可以固定表头&#xff0c;左右滚动时&#xff0c;可以固定最左列。 需求&#xff1a; 1、列表可以使用数组循环遍历&#xff1b; 2、上下滚动时&…

快手商品采集API商品列表API商品详情数据API接口获取快手商品信息API

背景介绍 快手商城是快手平台上的一个电商购物频道&#xff0c;类似于淘宝、京东等商城&#xff0c;用户可以通过搜索或者快手App首页的一级入口进入。目前&#xff0c;快手商城正在招商中&#xff0c;今年双11期间&#xff0c;快手将力推短视频、直播间、店铺、商城这一全新的…

springboot整合通用Mapper入门

springboot整合通用Mapper入门 概述 通用 Mapper 是一个用于简化 MyBatis 操作的开发框架。它通过提供通用的 CRUD&#xff08;创建、读取、更新、删除&#xff09;方法&#xff0c;减少了开发者需要编写的重复代码。通用 Mapper 的一个著名的实现是 MyBatis Generator&#…

python基于ModBusTCP服务端的业务实现特定的client

python实现ModBusTCP协议的client是一件简单的事情&#xff0c;只要通过pymodbus、pyModbusTCP等模块都可以实现&#xff0c;本文采用pymodbus。但要基于ModBusTCP服务端的业务实现特定的client&#xff0c;那得看看服务端是否复杂。前面系列文章&#xff0c;我们学习了对服务端…