public void BoilWater( ) { for (int i = 0; i < 100; i++) { temperature = i; if (temperature > 95) { //生成一个自定义的参数事件对象,在处理发布方法之前可以做一些其它事情 BoiledEventArgs e = new BoiledEventArgs(temperature); //将事件发布 OnBoiled(e); } } }
/// <summary> /// 烧水 /// </summary> public void BoilWater() { for (int i = 0; i < 100; i++) { temperature = i; if (temperature > 95) { //建立BoliedEventArgs 对象。 BoiledEventArgs e = new BoiledEventArgs(temperature); // 调用 OnBolied方法 OnBoiled(e); } } }
/// <summary> /// 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视 /// </summary> /// <param name="e"></param> protected virtual void OnBoiled(BoiledEventArgs e) { // 如果有对象注册 Boiled?.Invoke(this, e); // 调用所有注册对象的方法 }
//被注册的方法,订阅者收到事件后需要执行的方法 //按照.NET Framework准则,注册方法需要接收两个参数,第一个参数是事件源,第二个是自定义事件 public void MakeAlart(Heater obj, BoiledEventArgs e) { Console.WriteLine("Alarm recived event,temperature: {0} ,made by {1}", e.Tempareture, obj.Producer); }
//被注册的方法,订阅者收到事件后需要执行的方法 public void ShowMsg(Heater obj, BoiledEventArgs e) { Console.WriteLine("Display recived event,temperature: {0} ,made by {1}", e.Tempareture, obj.Producer); }
//包装事件回调方法,访问修饰使之可以被派生类重写回调方法 protected virtual void OnBoiled(BoiledEventArgs e) { //判断订阅是否为空,不为空则执行回调方法 handler?.Invoke(this, e); }