标签:
先来一段.NET4.5原生的异步
class Program { static void Main(string[] args) { ExecuteAsync(); Console.WriteLine("start"); Console.Read(); } static async void ExecuteAsync() { await Task.Run(() => { System.Threading.Thread.Sleep(100); Console.WriteLine("Async Executed"); }); Console.WriteLine("End"); } }
那么Unity因为只支持到阉割版的 mono .Net4.0,所以只能自己写一个类来模拟了
晚上心血来潮,在成功模拟了.Net4.5的异步,稍微有点别扭,以下是成果:
public class _ATAsync_MonoTestExample : MonoBehaviour { void Start() { var asyncOp = new ATAsync(); var moveLeftValue = asyncOp.Await<bool>(MoveLeft()); asyncOp.Async(() => { if (moveLeftValue.Value == true) { asyncOp.Await(MoveRight()); asyncOp.Await(BackOrigin()); asyncOp.Async(() => { Debug.Log("All Finished!"); }); Debug.Log("Start Execute!"); } }); } ...
执行结果:
因为没法实现静态类的全局的异步调用,会产生垃圾任务,解决起来比较麻烦。所以作为一个对象来操作也算比较方便的做法
异步的消息就放在Async方法中,等待就放在Await中。
那么为什么要分成Await和Async,完全可以用Await(...)一个方法。因为Await(...)接收的参数是异步任务的具体信息,包括任务怎么开始怎么结束。
Async(...)里是普通的执行操作,传入参数就是一个Action,其实是方便了调用
Task函数的具体实现,使用接口解决了下泛型的问题,也可以直接用lambda,不用函数封装
IATTask MoveLeft() { var result = new ATTask<bool>(handle => { Go.to(transform, 1f, new GoTweenConfig().position(new Vector3(50, 0, 0)).onComplete(tween => handle.Finished(true))); }); return result; }
.Net4.5的Async和Await以及在Unity3D中进行模拟
标签:
原文地址:http://www.cnblogs.com/hont/p/4925110.html