一、关于委托
1、委托概念:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递
个人角色这个概念有些晦涩难懂,大家可以把委托当成一个方法的指针就好了,可以指向一个方法。或者通过(+=)的方式指向多个。
2、四种声明方式
1)直接用delegate
public delegate int myDelegate(int x, int y);表示有两个参数,并返回int型。
int 类型为 这个myDelegate委托的默认返回值类型。括号内的参数为,委托中的参数。可以理解为,这个委托指向的需要执行的方法的参数。
比如像这个方法: public int sum(int a,int b)
{
int c=0;
c=a+b;
return c;
}
2)Action
这个无返回值的泛型委托,但是可以有参数(最多16个参数)
Action<int,string,bool> 表示有三个传入参数,类型分别为int,string,bool
3)Func
有返回值的泛型委托
Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型)返回值为int的委托
固定返回bool型的泛型委托,且只有一个参数
predicate<int> 表示传入参数为int 返回bool的委托
二、介绍BeginInvoke,EndInvoke
1、建立一个委托对象,通过IAsyncResult BeginInvoke(string name,AsyncCallback callback,object state)异步调用委托方法,BeginInvoke方法除最后的两个参数外,其他参数都是与方法参数相对应的。
2、利用EndInvoke(IAsyncResult--上一步BeginInvoke返回的对象)方法就可以结束异步操作,获取委托的运行结果。
三、实际异步执行中的使用方法
主要使用BeginInvoke与EndInvoke,关于返回值使用IAsyncResult对象获取
1、delegate
首先要定义一个委托,名称为CouDelegate
返回值为bool,入参为 int 类型
1)public delegate bool CouDelegate(int a);
2)主函数中如下
CouDelegate cpd = new CouDelegate(你要执行的方法);
IAsyncResult result = cpd.BeginInvoke(a, null, null);
获取返回值这么写:
bool flag= cpd.EndInvoke(result);//如果主函数中调用EndInvoke,那么启用的这个线程会一直执行完毕后,获取返回值,再继续往下走(与串行一样,未起到异步作用)
2、Action
Action a=myThreadMethod;//通过委托开启一个线程,委托指向myThreadMethod方法
a.BeginInvoke(这里写myThreadMethod的参数);
3、Func
Func<int, string,int> f = MyThread; //入参为int,string,返回值为int(第三个参数为返回值类型)
IAsyncResult ar=f.BeginInvoke(3,"str参数",null,null);//IAsyncResult可以获得当前线程的状态
while (ar.IsCompleted == false) //线程还没有结束(判断线程是否结束)
{
Console.Write(".");
Thread.Sleep(100); //休眠100ms(毫秒)即0.1秒;
}
int result = f.EndInvoke(ar);
4、predicate
用法与Func差不多呢