作者:PeterXu 来源:Blog.CSDN Blog: http://blog.csdn.net/peterreg/
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明,否则将追究法律责任。本文地址:http://blog.csdn.net/peterreg/archive/2008/04.aspx
一个凉馒头需要加热后食用,一般的加热步骤为(以微波炉为例):
1. 打开微波炉的门,放进馒头,关上微波炉的门;
2. 设定加热等级和加热时间,微波炉开始工作;
3. 设定时间到达后,微波炉以声音提示我们,加热过程结束,可以从中取出食用。
假设人和微波炉是软件中的两个模块,这两个模块间的交互有哪几种方式?
1. 人其它的事都不干,就一直看着微波炉,只到馒头热了拿出来;
2. 人可以干其它的事,但在一定的时间间隔后,过来看一下微波炉,看看加热是否结束。如加热结束则取出馒头,如加热未结束,则过一定的时间间隔后再来看,只到加热结束;
3. 人让微波炉工作后,就不用管它了,去干其它的事(比如说看电视、写BLOG。。。。我就是这样的。。哈哈)。微波炉加热工作结束后,以一定的方式通知人,使人知道它的状态改变了(工作变为待机)。
从软件模块间的调用方式上来分析:
1. 第一种是同步调用,即阻塞式调用,调用方必须等待被调用方执行完毕后再进行其它工作;
2. 第二种是轮询方式,调用方定期查看被调用方的状态,从而判断是否进行其它的任务。从效率上比第一种方式要高一些,但如果轮询的数量较多时,也影响系统的效率;
3. 第三种是回调模式,即异步调用的一种,调用方发任务给被调用方以后,转而执行其它的任务,被调用方在执行完成后,以一定的方式通知调用方。
在C++中的回调通过函数指针来实现,作为回调的函数必须为全局函数或静态函数;
在C#中采用代理(委托)来实现回调,一般的成员函数即可以实现回调。
部分代码如下:
... {
public delegate void DataHandle();
public event DataHandle HeatingEnd = null;
public MicroWaveOven()
...{
}
public void Heating()
...{
........
........
// 加热的相关代码
if(this.HeatingEnd != null)
...{
this.HeatingEnd();
}
}
}
public class Person
... {
public Person()
...{
}
public void HeatingBread() // 加热馒头
...{
MicroWaveOven mwo = new MicroWaveOven();
mwo.HeatingEnd += new MicroWaveOven .DataHandle(mwo_HeatingEnd);
mwo.Heating();
}
private void mwo_HeatingEnd() // 此函数作为参数传给对角mwo(类似于函数指针)
...{
MessageBox.Show("馒头加热好了。。。。")
// 此处可加上其它的处理代码
}
}
通过上面简单的代码,我们可以得出,采用异步回调的模式,可以使我们处理某些事件时变得非常方便。而在一些特殊场合下,必有采用回调模式才能解决。
Window事件就是一种特殊的委托,在WINDOW消息机制中,通过我们实现了上层的委托,从而是上层的代码能够融入到整个事件的处理程序当中,实现相关的功能。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2299806