IAsyncResult asyncResult = del.BeginInvoke(2, 5, null, null); // 异步调用方法 // 做某些其它的事情,模拟需要执行3 秒钟 for (int i = 1; i <= 3; i++) { Thread.Sleep(TimeSpan.FromSeconds(i)); Debug.Log(string.Format(\线程:{0}: 执行了 {1} s 时间(s).\} int rtn = del.EndInvoke(asyncResult); Debug.Log(string.Format(\计算结果为: {0}\\n\Debug.Log(\其它的事情完成\} public class Calculator { public int Add(int x, int y) { if (Thread.CurrentThread.IsThreadPoolThread) { Thread.CurrentThread.Name = \} 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; } } }
运行如下:
现在执行完这段代码,速度明显提升了几秒钟时间,两个for 循环所产生的输出交替进行,这也说明了这两段代码并行执行的情况。可以看到Add() 方法是由线程池中的线程在执行, 因为
Thread.CurrentThread.IsThreadPoolThread 返回了True,同时我们对该线程命名为了Pool Thread。
另外我们可以看到通过EndInvoke()方法得到了返回值。有时候,我们可能会将获得返回值的操作放到另一段代码或者客户端去执行,而不是向上面那样直接写在BeginInvoke()的后面。
比如说我们在Program 中新建一个方法GetReturn(),此时可以通过AsyncResult 的AsyncDelegate 获得del 委托对象,然后再在其上调用EndInvoke()方法,这也说明了AsyncResult 可以唯一的获取到与它相关的调用了的方法(或者也可以理解成委托对象)。
所以上面获取返回值的代码也可以改写成这样:
static int GetReturn(IAsyncResult asyncResult) { AsyncResult result = (AsyncResult)asyncResult; AddDelegate del = (AddDelegate)result.AsyncDelegate; int rtn = del.EndInvoke(asyncResult); return rtn; }
然后再将int rtn = del.EndInvoke(asyncResult);语句改为int rtn = GetReturn(asyncResult);。注意上面IAsyncResult 要转换为实际的类型AsyncResult 才能访问AsyncDelegate 属性,因为它没有包含在IAsyncResult 接口的定义中。
BeginInvoke()的另外两个参数分别是AsyncCallback 和Object 类型,其中AsyncCallback 是一个委托类型,它用于方法的回调,即是说当异步方法执行完毕时自动进行调用的方法。 它的定义为:
public delegate void AsyncCallback(IAsyncResult ar); Object 类型用于传递任何你想要的数值,它可以通过IAsyncResult 的AsyncState 属性获得。
下面我们将获取方法返回值、打印返回值的操作放到了OnAddComplete()回调方法中:
using UnityEngine; using System.Collections; using System.Threading; using System; using System.Runtime.Remoting.Messaging; 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); //IAsyncResult asyncResult = del.BeginInvoke(2, 5, null, null); // 异步调用方法 AsyncCallback callBackee = new AsyncCallback(OnAddComplete); // 异步调用方法 del.BeginInvoke(2, 2, callBackee, 6); // 做某些其它的事情,模拟需要执行3 秒钟 for (int i = 1; i <= 3; i++) { Thread.Sleep(TimeSpan.FromSeconds(i)); Debug.Log(string.Format(\线程:{0}: 执行了 {1} s 时间(s).\} // int rtn = del.EndInvoke(asyncResult); //Debug.Log(string.Format(\计算结果为: {0}\\n\Debug.Log(\其它的事情完成\} static void OnAddComplete(IAsyncResult asyncResult) { AsyncResult result = (AsyncResult)asyncResult; AddDelegate del = (AddDelegate)result.AsyncDelegate; int data = (int)asyncResult.AsyncState; int rtn = del.EndInvoke(asyncResult); Debug.Log(string.Format(\线程:{0}: 结果为, {1}; 继续相乘 {2}结果为:{3}\\n\rtn*data)); } public class Calculator { public int Add(int x, int y) { if (Thread.CurrentThread.IsThreadPoolThread) { Thread.CurrentThread.Name = \} 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; } } }
运行结果:
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库unity3D学习委托进阶、回调函数(三)(4)在线全文阅读。
相关推荐: