Mecanim 发表于 2021-11-15 11:52

Unity3d的Task存在的坑

Unity3d的Task存在的坑

super1 发表于 2021-11-15 11:57

老古董表示现在还在new thread有时候甚至还用C++的库。。

KaaPexei 发表于 2021-11-15 12:01

觉得C# Async不好用,涉及多线程及传染性太强,所以实际项目中一直都在使用Promise作为替代方案。

JamesB 发表于 2021-11-15 12:10

黑猫白猫,适合解决当前季几遇到的问题的都是好喵[赞][赞][赞]。

DomDomm 发表于 2021-11-15 12:17

嗯,C# Async的传染性强估计是作者有意为之,作者好像也提倡 async all。对于我们,还是得像你一样,结合生产实际来选型,并没有最好的方案,只有最适合当前的方案,o(* ̄︶ ̄*)o

BlaXuan 发表于 2021-11-15 12:23

每个人遇到的要解决的问题的量级不同,所以写代码没有万金油。也庆幸没有万金油,不然我们的乐趣要少好多[捂嘴]。大佬不可妄自菲薄自己是老古董。

fwalker 发表于 2021-11-15 12:31

目前task的主要问题还是取消不方便,不能像协程那样在内部不做处理的情况下直接从外部取消。之前我有写(抄)过一个东西让task协程化(后来又在rpgmaker里写了个promise版),实际用起来尤其是做动画的时候,取消动画变得繁琐了,就束之高阁了。

NoiseFloor 发表于 2021-11-15 12:32

这个确实是个比较大的问题,取消起来不方便,感谢补充指正

acecase 发表于 2021-11-15 12:32

应用需求场景不同,async/await请在计算密集型/IO密集型需求下使用,因为这个是真的可以拿来写多线程并发优化。Unity本质还是个单线程,而且相关的协程还是其引擎层进行调度,和async这类更底层的异步编程还是有一定的区别。同时也因为Unity的单线程导致相关的API设计上不是线程安全的,所以即便Task.Run了一个跑在别的线程的任务也没法去用Unity的API。综上也就是:如果觉得unity的一些IO操作效率不喜/存在有类似复杂的寻路算法运算/自实现的ECS数据逻辑剥离解耦[只涉及到纯数据而无需直接和UI交互]的时候建议使用async/Task去实现来达成真正的并发优化,其他时候还是安心使用Unity本家的协程去做更合适。
顺带一提这也是Task不提供Abort的缘故,任务本身是个抽象概念,可以同步可以异步可以单线程也可以多线程,在多线程情况下一个线程不可能直接去强制终止另一个线程的运行---因为你们两同处一个层面;在单线程情况下你也不能终止自身,因此对于Task你需要准备一个CancellationToken 用作取消令牌并将其在启动相关任务的时候丢过去,然针对这个令牌执行取消【请求】,然后等那个Task的函数正常走完相关流程。协程那边本质上还是unity自己调度的一个周期性循环调用而且还是单线程,自然可以终止一个协程[放弃之后循环中执行]
页: [1]
查看完整版本: Unity3d的Task存在的坑