对于C#的事件机制我觉得订阅者和发布者非常的形象。
这里举一个老湿发布作业的例子。老师有一个发布作业的事件,而学生则需要订阅这个事件,老师一旦发布了作业,学生就要处理作业。这就是所谓的代理,老师动动嘴(抄写新华字典一边),学生就要不停的写,反正老师又不干。
首先需要定义老师这个类
class Teacher
{
//public event EventHandler PublishWorkEvent;//标准的事件定义
public event Action<object, WorkEventArgs> PublishWorkEvent;//发布作业的事件
public virtual void PublishEvent(WorkEventArgs e)//触发事件的方法,发布事件
{
if(e != null)
{
PublishWorkEvent(this,e);//通知所有订阅者,让订阅者处理事件
}
}
}
这里老师布置的作业具体在自定义的事件处理类WorkEventArgs中
class WorkEventArgs//事件参数类
{
public string Works { get; }
public WorkEventArgs(string works)
{
Works = works;
}
}
接着定义一个学生类
class Student
{
public void WorkHandler(object sender,WorkEventArgs e)//代理,和老师的发布事件进行关联,老师说学生做
{
Console.WriteLine("teacher publish work,student " + e.Works);
}
}
接着就是例子了
static void Main(string[] args)
{
Teacher tr = new Teacher();//事件发布者
Student st1 = new Student();
Student st2 = new Student();
Student st3 = new Student();
//事件拥有者(发布事件)和事件订阅者(处理事件)建立订阅关系
tr.PublishWorkEvent += st1.WorkHandler;
tr.PublishWorkEvent += st2.WorkHandler;
tr.PublishWorkEvent += st3.WorkHandler;
while(true)//每隔1s触发一次事件
{
Thread.Sleep(1000);
tr.PublishEvent(new WorkEventArgs("抄写新华字典"));
}
}