原则:
1、C#的事件驱动本质是对以前消息驱动的概念更新与升级
消息驱动模型:发送方发送消息->操作系统维护消息->消息的接收方响应消息
事件驱动模型:发送方引发事件->操作系统维护事件->事件的响应方处理事件
在上面的模型中,发送方和接收方可以是同一个对象或者实例
2、C#事件的使用方法举例:
环境描述为:
在一段代码中,一个对象定义了一个事件,另外一个事件处理这个事件;
引发事件是在功能代码中来进行
b对象需订阅这个事件,这个工作是在代码中实现的,通过+=关联事件和事件处理程序
3、
》先定义个委托 delegate void fun(int i)
》a对象中定义事件,要用到event关键字和定义好的委托,这样指明事件处理程序是什么样的格式(要什么参数,有什么返回值)
public event fun eventObj;
这样对象a就有了个有意义的,实例化的事件
》引发事件,引发事件是一段代码中执行,这段代码可以放在a对象的一个成员函数中,也可以在任意的一段代码中,只要能有效地访问a对象即可
用代码:eventObj(6); 或者在外部a.eventObj(6);
引发事件的时候,要带上参数,这些参数就是传递给事件处理程序的参数,所以参数表和委托所指定的草书表需匹配。
》关联事件,把事件和事件处理程序关联起来,这个工作放在功能执行代码中,一个事件可以关联多个事件处理程序,事件发生的时候,所有关联上的事件处理程序均会执行,但是顺序随机不能保证。
同样地,关联事件这段代码,在任何地方均可,只要代码执行到即可,执行关联语句之后操作系统则会监听这个事件,并在事件引发的时候交给事件处理程序(可能多个)执行。
a.eventObj += new fun(b.funObj);
也可以,
B b = new B();
fun fun1 = new fun(b.funObj);
a.eventObj += fun1;
一般用第一种的写法,因为实例化一个委托变量并给一个命名并不需要,这个委托变量不需要指向其他事件处理程序的时候,就直接用临时对象关联起来即可,省的命名。
》事件处理程序
这个非常简单,就是一个函数,满足委托规定的签名即可(参数类型,个数,返回值),当事件发生的时候,这个函数就会执行
这在多线程之间相当有用,因为事件处理是操作系统来做的,操作系统负责监听,匹配,调用事件处理程序
所以事件可以用在多线程之间的通信,就像以前的sendmessage一样来做到线程之间通信。
class B
{
void funObj(int i)
{
}
}