using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EventSamle { public class AlarmEventArgs : System.EventArgs//事件参数 { private bool _snoozPresed;//懒惰键 private int _nrings;//响了几次 public bool SnoozPressed { get { return _snoozPresed; } set { _snoozPresed = value; } } public int NumRings { get { return _nrings; } set { _nrings = value; } } public string AlarmText//提醒 { get { if (SnoozPressed) return ("Wake up!!! snooze time is over."); else return ("Wake up!!!"); } } public AlarmEventArgs(bool snooz, int nrings) { this._snoozPresed = snooz; this._nrings = nrings; } } public delegate void AlarmEventHander(object sender, AlarmEventArgs e);//1.声明委托事件处理函数,其实是个类 public class AlarmClock//产生事件的类 { private bool _snoozPressed = false; private int _nrings = 0; private bool _stop = false; public bool Stop//是否停止。事件类的域,这个例子中事件处理函数会反馈修改这个域的值 { get { return _stop; } set { _stop = value; } } public bool SnoozPressed//是否懒惰。事件类的域,这个例子中事件处理函数会反馈修改这个域的值 { get { return _snoozPressed; } set { _snoozPressed = value; } } public event AlarmEventHander Alarm;//2.声明一个事件,或叫做产生一个委托事件处理函数的实例 protected virtual void OnAlarm(AlarmEventArgs e)//3.触发事件的函数,protected { if (Alarm != null)//一定要加! { Alarm(this, e); } } public void Start()//调用这个函数后开始触发事件,传入参数 { for (; ; ) { _nrings++; if (Stop) break; else if (SnoozPressed) { System.Threading.Thread.Sleep(1000); AlarmEventArgs e = new AlarmEventArgs(SnoozPressed, _nrings); OnAlarm(e); } else { System.Threading.Thread.Sleep(300); AlarmEventArgs e = new AlarmEventArgs(SnoozPressed, _nrings); OnAlarm(e); } } } } public class WakeUp//处理事件的类 { public void RingRang(object sender, AlarmEventArgs e)//4.处理事件的函数,同delegate签名一样 { Console.WriteLine(e.AlarmText+"\n"); if(!e.SnoozPressed) { Console.WriteLine(" Let alarm ring? Enter Y"); Console.WriteLine(" Stop Alarm? Enter Q"); Console.WriteLine(" Press Snooze? Enter N"); string input = Console.ReadLine(); if(input.Equals("Y")||input.Equals("y")) return; else if(input.Equals("Q")||input.Equals("q")) { ((AlarmClock)sender).Stop = true;//这个例子中可以向发送者反馈信息 return; } else { ((AlarmClock)sender).SnoozPressed = true; return; } } else { Console.WriteLine(" Let alarm ring? Enter Y"); Console.WriteLine(" Stop Alarm? Enter Q"); string input = Console.ReadLine(); if(input.Equals("Y")||input.Equals("y")) return; if(input.Equals("Q")||input.Equals("q")) { ((AlarmClock)sender).Stop = true; return; } } } } public class AlarmDriver//测试类 { public static void Main (string[] args) { // Instantiates the event receiver. WakeUp w= new WakeUp(); // Instantiates the event source. AlarmClock clock = new AlarmClock(); // Wires the AlarmRang method to the Alarm event. clock.Alarm += new AlarmEventHander(w.RingRang);//把事件处理函数注册到事件处理队列中 clock.Start(); } } }