2.1 什么样的代码是异步代码

假设有一个“实现一个闹钟,5秒后铃响”的功能,Unity中有很多方法可以实现,其中有一个方法是下面这样的。这是个同步方法,会卡住程序。代码中的Sleep方法表示让程序休眠,程序运行到该方法时,会等待5000毫秒(即5秒),再打印出“铃铃铃”。

        void Start () {
            System.Threading.Thread.Sleep(5000);
            Debug.Log("铃铃铃");
        }

另一个实现方法称为异步程序,代码如下:

        using System.Collections;
        using System.Collections.Generic;
        using UnityEngine;
        using System.Threading;

        public class Async : MonoBehaviour {
            // Use this for initialization
            void Start () {
                //创建定时器
                Timer timer = new Timer(TimeOut, null, 5000, 0);
                //其他程序代码
                //……
            }

            //回调函数
            private void TimeOut(System.Object state){
                Debug.Log("铃铃铃");
            }
        }

代码解释:

在Start方法中创建一个定时器对象timer(定时器Timer类位于System.Threading命名空间内)。Timer类的构造函数有4个参数:第一个参数TimeOut代表回调函数,即打印“铃铃铃”的方法;第三个参数5000代表5000毫秒,即5秒;另外两个参数暂不需要关心。整个程序的功能就是开启定时器,5秒后回调TimeOut方法,打印“铃铃铃”。

这种方法称为异步,它指进程不需要一直等下去,而是继续往下执行,直到满足条件时才调用回调函数,这样可以提高执行的效率。

如图2-1所示,异步的实现依赖于多线程技术。在Unity中,执行Start、Update方法的线程是主线程,定时器会把定时任务交给另外的线程去执行,在等待5秒后,“另外的某条线程”调用回调函数。主线程继续往下执行代码,不受影响。

图2-1 闹钟程序示意图