码迷,mamicode.com
首页 > 编程语言 > 详细

.Net4.5的Async和Await以及在Unity3D中进行模拟

时间:2015-10-31 11:24:31      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:

先来一段.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");
    }
}
View Code

 

 

 

那么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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!