委托:
在c#中定义为:委托就像一个函数的指针,在程序运行时可以使用它们来调用不同的函数。
我的理解就是一个方法,但是需要传入的参数类型与普通参数不同,需要传入另一个方法作为参数。
委托的使用:
首先定义一个委托类:public delegate int MethodDel();
然后实例化一个委托:public MethodDel addMethod = new MethodDel(Add);,其中Add();方法的返回值与参数必须与定义的委托类的返回值和参数相同。
使用时可以添加委托链:addMethod += Add2;同理也可以进行减等操作。
委托的调用:
委托的调用分为同步调用、异步调用和异步回调。
同步调用:即使用Invoke();方法。同步调用又称阻塞调用,会阻塞当前线程。
异步调用:一步调用不会阻塞线程,而是把线程放到线程池中,程序会继续执行。通过BeginInvoke();和EndInvoke();来实现。
但是如果运行到EndInvoke();时,调用没有执行完毕,依然会阻塞线程。
异步回调:当调用结束时会自动调用回到函数,解决了为等待调用结果,而让线程依旧被阻塞的局面。
测试代码:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Threading;using System.Collections;using System.Runtime.Remoting.Messaging;namespace StudyTest{ class PRogram { public delegate int MethodDel(); public static MethodDel addMethod = new MethodDel(Add); static void Main(string[] args) { Console.ReadKey(); addMethod.Invoke(); Console.WriteLine("同步调用完成"); Console.ReadKey(); IAsyncResult resule = addMethod.BeginInvoke(null, null); Console.WriteLine("做别的事情"); Console.ReadKey();//代表做别的事情,再次停顿5秒以上 addMethod.EndInvoke(resule); Console.WriteLine("异步调用完成"); Console.ReadKey(); IAsyncResult resulet = addMethod.BeginInvoke(new AsyncCallback(回调函数), "AsycState:OK"); Console.WriteLine("做别的事情"); Console.ReadKey(); } public static int Add() { Thread.Sleep(5000);//代表正在调用,停止5秒 return 3; } public static void 回调函数(IAsyncResult result) { addMethod= (MethodDel)((AsyncResult)result).AsyncDelegate; Console.WriteLine(addMethod.EndInvoke(result)); Console.WriteLine(result.AsyncState); } }}
新闻热点
疑难解答