77范文网 - 专业文章范例文档资料分享平台

unity3D学习委托进阶、回调函数(三)(3)

来源:网络收集 时间:2019-06-05 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

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)在线全文阅读。

unity3D学习委托进阶、回调函数(三)(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/649439.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: