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();
}
}
}
转载于:https://www.cnblogs.com/fengxuewo/archive/2011/09/28/2194728.html