C#关于委托(delegate,Invoke,BeginInvoke,EndInvoke)
对于委托的定义相比不用多说,简述一下就是:
委托从字面上理解就是一种代理,类似于房屋中介,由租房人委托中介为其租赁房屋。或者说委托类似领导。由客户委托你领导,但是活还是你干。
在说下怎么使用委托:
三步走:定义声明委托、实例化委托、调用委托
看起来是不是也不算很难,举个栗子。
class Program
{
//定义委托,此委托返回值为void,参数为string(我不是多此一举说明这些显而易见的问题,当然也不是为了凑字数,毕竟又不是写作文要达到规定字数)
//解释:这个委托可以用来表示任意返回值为Void,参数为string的函数。就好比typeC接口充电器一样,可以适配任意支持TypeC接口的手机
public delegate void MyDelegate(string a);
static void Main(string[] args)
{
string a="及你太美";
//下面这行看起来会比较难理解,我们逐步分析。
//首先 MyDelegate myDelegate = new MyDelegate() 声明了一个MyDelegate类型的委托对象。(冷笑话:没有对象怎么办,new一个)
//然后把实例化test类,取到test类里面一个函数。把这个函数作为参数
//最后把上面两步和起来就完成了一个委托的实例化。
MyDelegate myDelegate = new MyDelegate(new Test().Gege);
//这里显而易见就是调用委托的地方了。
//运行过程可以这样理解:myDelegate接受到"及你太美"的指令,但是它不会唱,跳,reppar。所以它把"及你太美"的指令委托给了"Gege"去做,然后"Gege"就会做这件事情输出"及你太美"。
myDelegate(a);
}
}
class Test
{
public void Gege(string a)
{
Console.WriteLine(a);
}
}
看完上面的这么一大堆文字描述,我想必读者应该完全掌握了委托的使用了。
看完上面这句话是不是火冒三丈?
读者咋就完全掌握委托的使用了,完全还是云里雾里的好吧。
当时作者我看完有关委托的简述的时候和你们现在的表情是一模一样的。
这有啥用?写这么多代码不是纯纯脱裤子放屁,多此一举吗?
我直接New 一个test对象,如果去调用”Gege“不是一模一样的效果么?
上述那些困惑其实作者目前也没有完全搞清楚,只是分享一些作者在探寻这些问题时感悟,经验等等。
愿诸君共勉!
在解释上面这个两个问题时,请各种先跟随我学习一下下面这个代码。这会使各位对委托的理解更为深入。
我们改写一下上面的代码,重复的注释我就不在累述了。
class Program
{
public delegate string MyDelegate(string a);
static void Main(string[] args)
{
string a="及你太美";
MyDelegate myDelegate = new MyDelegate.(new Test().Gege);
//方式一
IAsyncResult async = myDelegate.BeginInvoke(a);
if(!async.IsCompleted)
{
thread.sleep(2000);
Console.WriteLine("**");
}
//Gege的返回值为:
//下面这两句话将被阻塞10s。想象一下:如果这是在UI线程中,将会多么可怕。
string GegeResult = myDelegate.EndInvoke(async);
Console.WriteLine(GegeResult);
//执行结果如下:
//**
//**
//**
//**
//**
//及你太美
//方式二
IAsyncResult async = myDelegate.BeginInvoke(a,new AsyncCallback(RapperCallback),null);
Console.WriteLine("篮球表演");
//执行结果如下:
//篮球表演
//及你太美
//10秒rapper表演结束
//这里可以看到篮球表演并没有被10秒rapper表演阻塞,而是同时进行的。可以理解为开辟了一个线程
}
static void RapperCallback()
{
Console.WriteLine("10秒rapper表演结束");
}
}
class Test
{
public string Gege(string a)
{
//延时10秒,这里模拟一些耗时操作(比如说rapper表演要10秒)
thread.sleep(10000);
Console.WriteLine(a);
retrun a;
}
}
这个时候,读者应该是有了一些关于什么时候需要去使用委托的概念了吧。
然后我在官方的给什么使用委托下个定义:
== 1:在UI线程中,有耗时操作的时候考虑使用委托
2:类似一个函数封装的概念,但是作者目前还没有接触到需要用委托的方式来进行函数封装的实例,这里仅作为参考==