ET源码学习(十三):CoroutineLock
2021/7/2 11:24:21
本文主要是介绍ET源码学习(十三):CoroutineLock,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
在第八节消息分发时有下面这个代码
可以看到下面代码中有一个叫做协程锁的组件,并且利用了using包裹起来了,这个就是协程锁。主要用途是确保只有一个协程对对象进行操作。具体可以参考烟雨大佬B站讲解(https://www.bilibili.com/video/BV12J411E7ik)
下面来看一下协程锁如何实现的
CoroutineLock继承IDisposable可以使用using并利用Dispose释放
下面可以看到当CoroutineLock被释放时,将会利用携程锁组件进行通知Notify,目前不知道key和index含义
CoroutineLockType
CoroutineLockQueue就是一个排序字典,Value是一个返回CoroutineLock的任务
CoroutineLockQueueType也是一个字典,Value相当于CoroutineLockQueue
CoroutineLockTimer
下面开始看组件的逻辑
属性
list:上面CoroutineLockType有几个这里就有几个CoroutineLockQueueType,并且放进List中。
nextFrameRun:
timers:超时排序字典,key为超时时间
timeOutIds、timerOutTimer、minTime超时相关
方法逻辑
Awake
组件初始化将会根据CoroutineLockType类型个数初始化list。每个类型对应一个CoroutineLockQueueType
Update
从nextFrameRun拿出存储的类型和id开始调用Notify,这个函数放在后面看
TimeoutCheck超时检测,里面写法和TimerComponent很像可以自己看
Wait
这个函数可以看到是这篇文章开头的图片上的await的的函数,可以知道key是actorId
首先去list找到对应类型的CoroutineLockType,如果没有这个id的,那么加入到CoroutineLockType。然后直接返回结果
如果此类型有这个id,创建一个ETTask,并且设置超时时间,最后开始等待这个ETTask完成。
Notify
跟上面差不多通过类型从list取CoroutineLockType, 如果里面没有这ActorId那么就return。
如果有查看CoroutineLockQueue里有东西没,没东西就直接回收。然后判断迭代次数,大于10放到下一帧去执行。
小于10就从CoroutineLockQueue中取出最早放的,设置ETTask的结果。这里发现。设置结果时,将index+1了。而在看CoroutineLock时发现。CoroutineLock在调用Dispose是会继续调用Notify。这里可以直接也就是下一个协程
在捋ET整个流程时候再看实际用途
这篇关于ET源码学习(十三):CoroutineLock的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享