
增加自定义Task ETTask,ETTask不会使用同步上下文,必须保证调用跟回调都在主线程。Unity跟ETServer都是单线程逻辑,所以这一修改将大大提高性能
ETTask是什么?
使用C#7,异步方法可以返回task-like的类型, 详情可以谷歌搜索关键字 task-like
ETTask是一个轻量级单线程的task,相比Task性能更强,GC更少
甚至ETTask只支持单线程
因为Task太容易被人误解,我专门搞了个完全单线程的ETTask
异步的本质就是把回调的形式变成同步的写法而已。那么什么情况要回调呢?回调有单线程回调也有多线程回调啊。这跟ettask毛线关系都没有。ettask就是把你的回调改成同步的写法而已,具体你是改单线程回调还是多线程回调都跟ettask无关
ETtask只能用unity2018.3以上版本
ETVoid是代替async void,意思是新开一个协程。ettask跟task一样。当然task不去await也相当于新开协程,但是编辑器会冒出提示,提示你await。所以新开协程最好用ETVoid。4.0用async void。使用场景,自己写写就明白啦. 协程就是回调.
熊猫:
ettask还要啥教程?
要搞懂ettask 下载一个jetbrain peek工具,反编译下看下生成的代码就行了。
参考Timercomponent,看懂就全明白了
看网上的文章看十年也不会明白,自己写一下timercomponet啥都懂了
vs Task
【群主】熊猫(80081771) 2018-08-10 9:58:57
不要用任何微软提供的task创建方法,多线程会把你搞死搞残
多线程的问题没什么文章可以写的,其实很简单,你能不能保证另外的线程逻辑是线程安全的?很多人开线程开task从来不考虑这个问题,结果导致问题。说实话我写了10多年代码都不敢做这种保证,上次socket库就不小心出了个多线程的bug。我自己几乎不用多线程,假如用那也是非常非常小心的。反正记住一点,不用多线程就行了
【群主】熊猫(80081771) 2018-08-10 10:15:41
ET是单线程的,所以不会管理线程
跨线程都是把委托投递到一个队列,主线程不停从队列中取出委托执行
你看看asynctool的代码,本质上就是把委托投递到主线程
每帧取完队列中的所有委托,执行完
【码奴】戏莳(231098595) 10:29:26
现在用asnyc特别小心,await的前后都要做些检查保护
【群主】熊猫(80081771) 10:31:14
@戏莳 那到不用,async设置了同步上下文是线程安全的,只要不用task.run什么的就行了
【群主】熊猫(80081771) 2018-08-10 10:39:48
用ET不要自己去搞多线程,除非自己对线程把控力非常强
【码仙】底层拼图仔 AE(210379417) 10:28:23
async await 如果用的Task. await后面的部分是不确定在哪个线程执行的,猫大以前4.0的做法就是把上下文抛到主线程,让主线程执行.
如果用的是ETTask. await后面的部分是一定在主线程执行的. 就完全相当于写了个回调方法了.
【码仙】底层拼图仔 AE(210379417) 10:28:48
Task 实际上也是回调, 不过这个回调方法的执行原本可能不在主线程罢了.
【码圣】梦不死(77122954) 15:12:48
都说ET是单线程。但在接收网络消息的时候应该是多线程的吧?多个session同时收到消息是否同时在处理?涉及到公共数据的改变是否应该做队列处理?
【码圣】 々风恒¢(710490061) 15:13:28
网络消息接收是异步,处理是回主线程
【码圣】梦不死(77122954) 15:22:51
这里?

【码圣】 々风恒¢(710490061) 15:23:08
对的