Debug.Log(string.Format(\开始计算{0}+{1}=?\// 执行某些事情,模拟需要执行2 秒钟 for (int i = 1; i <= 2; i++) { Thread.Sleep(TimeSpan.FromSeconds(i)); Debug.Log(string.Format(\线程:{0}: 添加 执行了{1}s 时间(s).\} Debug.Log(\计算成功!\return x + y; } } }
注:如果你确实执行了这段代码,会看到这些输出并不是一瞬间输出的,而是执行了大概十多秒的时间才显示那是因为线程是串行执行的,所以在执行完Add()方法之后才会继续Start中剩下的代码。
当你关掉,再次运行游戏会报错“InvalidOperationException: Thread.Name can only be set once.”,说线程名只能设置一次
因为方便测试我就直接写了,因此大家再测试的可以
1.关掉unity 再重新打开运行
2.第二次运行前,打开代码 找到start中改成// Thread.CurrentThread.Name = \即可 当然自己写个判断也行 运行如下:
上面模拟了一个计算器,进行数学运算的过程...用到了几个关于对于线程的操作,不是unity的StartCoroutine协程,而是c#的Thread线程,在此他们区别暂不多说,以后我会专门讲解。
好了,先看看Thread的几个方法
1. Thread.Sleep(),它会让执行当前代码的线程暂停一段时间(如果你对线程的概念比较陌生,可以理解为使程序的执行暂停一段时间),以毫秒为单位,比如
Thread.Sleep(1000),将会使线程暂停1 秒钟。在上面我使用了它的重载方法,个人觉得使用TimeSpan.FromSeconds(1),可读性更好一些。
2. Thread.CurrentThread.Name,通过这个属性可以设置、获取执行当前代码的线程的名称,值得注意的是这个属性只可以设置一次,如果设置两次,会抛出异常。
3. Thread.IsThreadPoolThread,可以判断执行当前代码的线程是否为线程池中的线程。
通过这几个方法和属性,有助于我们更好地调试异步调用方法。
接下来我们定义一个AddDelegate 委托,并使用BeginInvoke()方法来异步地调用它。在上面已经介绍过,BeginInvoke()除了最后两个参数为AsyncCallback 类型和Object 类型以外,前面的参数类型和个数与委托定义相同。
另外BeginInvoke()方法返回了一个实现了IAsyncResult 接口的对象(实际上就是一个AsyncResult 类型实例,注意这里IAsyncResult 和AysncResult 是不同的,它们均包含在.NET Framework 中)。
AsyncResult 的用途有这么几个:传递参数,
它包含了对调用了BeginInvoke()的委托的引用;
它还包含了BeginInvoke()的最后一个Object 类型的参数;
它可以鉴别出是哪个方法的哪一次调用,因为通过同一个委托变量可以对同一个方法调用多次。
EndInvoke()方法接受IAsyncResult 类型的对象(以及ref 和out 类型参数,这里不讨论了,对它们的处理和返回值类似),所以在调用BeginInvoke()之后,我们需要保留IAsyncResult,以便在调用EndInvoke()时进行传递。这里最重要的就是EndInvoke()方法的返回值,它就是方法的返回值。
除此以外,当客户端调用EndInvoke()时,如果异步调用的方法没有执行完毕,则会中断当前线程而去等待该方法,只有当异步方法执行完毕后才会继续
执行后面的代码。所以在调用完BeginInvoke()后立即执行EndInvoke()是没有任何意义的。
我们通常在尽可能早的时候调用BeginInvoke(),然后在需要方法的返回值的时候再去调用EndInvoke(),或者是根据情况在晚些时候调用。
说了这么多,我们现在看一下使用异步调用改写后上面的代码吧:
using UnityEngine; using System.Collections; using System.Threading; using System; public class test : MonoBehaviour { //声明委托,返回值为int类型 public delegate int AddDelegate(int x, int y); // Use this for initialization void Start() { Debug.Log(\程序开始运行:\//Thread.CurrentThread.Name = \Calculator cal = new Calculator(); //int result = cal.Add(6, 8); //Debug.Log(string.Format(\结果为: {0}\\n\AddDelegate del = new AddDelegate(cal.Add);
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库unity3D学习委托进阶、回调函数(三)(3)在线全文阅读。
相关推荐: