using System;
using System.Collections.Generic;
using System.Text;
namespace eventpro
{
class PubEventArgs : EventArgs //定义一个提供事件数据的类,如果事件不需要传递数据,可以直接使用系统提供的System.EventArgs。
{
private readonly string m_magazineName;
private readonly DateTime m_pubDate;
public PubEventArgs(string magazineName, DateTime pubDate)
{
m_magazineName = magazineName;
m_pubDate = pubDate;
}
public string magazineName
{
get { return m_magazineName; }
}
public DateTime pubDate
{
get { return m_pubDate; }
}
}
class Publisher //事件的发行者
{
public delegate void PubComputerEventHandler(object sender,PubEventArgs e); //声明事件所需的代理
public delegate void PubLifeEventHandler(object sender,PubEventArgs e);
public event PubComputerEventHandler PubComputer; //事件声明
public event PubLifeEventHandler PubLife;
protected virtual void OnPubComputer(PubEventArgs e) //引发事件类中提供一个受保护的方法,解决可能存在的线程同步问题。以OnEventName进行命名。
{
PubComputerEventHandler handler = PubComputer;
if (handler !=null )
{
handler(this,e);
}
}
protected virtual void OnPubLife(PubEventArgs e) //引发事件类中提供一个受保护的方法,解决可 能 存在的线程同步问题。以OnEventName进行命名。
{
PubLifeEventHandler handler = PubLife;
if (handler != null)
{
handler(this, e);
}
}
public void issueComputer(string magazineName,DateTime pubDate) //触发事件的方法
{
Console.WriteLine("发行"+magazineName );
OnPubComputer(new PubEventArgs (magazineName,pubDate));
}
public void issueLife(string magazineName, DateTime pubDate) //触发事件的方法
{
Console.WriteLine("发行" + magazineName);
OnPubLife(new PubEventArgs(magazineName, pubDate));
}
}
class Subscriber //订阅者
{
private string name;
public Subscriber(string name)
{
this.name = name;
}
public void Receive(object sender,PubEventArgs e)//在事件订阅者中定义事件处理程序
{
Console.WriteLine(e.pubDate +name +" "+"接收到了"+e.magazineName );
}
}
class Program
{
static void Main(string[] args)
{
Publisher Pub = new Publisher();
Subscriber zs = new Subscriber("张三");
Pub.PubComputer += new Publisher.PubComputerEventHandler(zs.Receive );//向事件发行者订阅一个事件
Subscriber ls = new Subscriber("李四");
Pub.PubComputer += new Publisher.PubComputerEventHandler(ls.Receive );
Pub.PubLife += new Publisher.PubLifeEventHandler(ls.Receive);
Pub.issueComputer("电脑杂志",Convert.ToDateTime ("2006-1-1"));
Pub.issueLife("生活杂志",Convert.ToDateTime ("2006-1-2"));
Console.WriteLine();
Console.WriteLine("一年以后");
Pub.issueComputer("电脑杂志", Convert.ToDateTime("2007-1-1"));
Pub.issueLife("生活杂志", Convert.ToDateTime("2007-1-2"));
Console.ReadLine();
}
}
}