From: http://www.cnblogs.com/gzhnan/articles/1896296.html
C#事件支援發行者/訂閱者模式,發行者將事件通知給訂閱者,而訂閱者在事件發生時調用已經註冊好的事件處理函數。
首先要在一個類中定義某種類型的委託和此種委託類型事件。然後在該類中通過一個函數,將該事件進行觸發。 當外部其他類有對該事件訂閱時候,其他類會轉去處理該事件的處理常式。從而完成資訊的交流。這樣做,一個最大的好處就是事件觸發類不用關心該事件的所有處 理程式,只關心他自己的工作以及他所關心的事件即可。而對該事件感興趣的類會首先訂閱該事件,當該事件發生時會捕捉到事件資訊,並轉去處理。
舉一個簡單的例子 有兩個類,機器mechine類,和維修工check類。mechine類在運行過程當中如果出現某種故障,他會拋出brokendown()資訊。如果check類對該事件有訂閱,他會捕捉到該資訊然後轉去心相應的處理常式。
using System;
class Mechine //定義一個發行者類
{
public delegate void delegateName(string name); //定義具有某種傳回型別命令參數代理類型
public event delegateName eventName; //定義委託類型的事件
public void Fun()
{
if (eventName != null) //如果事件不等於空就是說有訂閱者註冊過該事件,也就是說觸發事件後有相應的事件處理函數被調用。
{
Console.WriteLine("報告,機器已經出現故障");
eventName(string _name); //在類中觸發該事件
}
}
}
class Check //有訂閱上述事件的類
{
public void Fix(string str)
{
Console.WriteLine("請讓"+str+"去進行修理");
}
}
class Program
{
static void Main()
{
Mechine mechine1 = new Mechine(); //執行個體化一個Mechine類
Check c1 = new Check();
mechine1.eventName += new Mechine.delegateName(c1.Fix);
//用當前類中Fix函數訂閱mechine類中eventName函數,注意這裡Fix的函數結構要跟事件和代理的委託要相同(形參以及傳回值全部相同),這樣當Mechine類中事件觸發時,系統會通知Check類轉到Fix函數。
Mechine.Fun("張三");
}
}
具體使用方法過程如下:
1.委託定義delegate
2.事件定義 event
3.事件觸發
4.事件訂閱以及處理
簡單的貓叫,老鼠跑,主人醒
using System;
using System.Collections.Generic;
using System.Text;
namespace DelegateEvent
{
public delegate void CatEventHandler(object sender, EventArgs e);
public class Cat
{
public event CatEventHandler CatEvent;
public void Scream(EventArgs e)
{
if (CatEvent != null) //有沒有訂閱
{
Console.WriteLine("貓叫……");
CatEvent(this, e);
}
}
public void Mouse(object sender,EventArgs e)
{
Console.WriteLine("老鼠跑……");
}
public void People(object sender, EventArgs e)
{
Console.WriteLine("主人醒……");
}
static void Main()
{
Cat cat = new Cat();
cat.CatEvent += new CatEventHandler(cat.Mouse);
cat.CatEvent += new CatEventHandler(cat.People);
cat.Scream(EventArgs.Empty);
Console.Read();
}
}
}
From: http://www.cnblogs.com/gzhnan/articles/1896296.html
C#事件支援發行者/訂閱者模式,發行者將事件通知給訂閱者,而訂閱者在事件發生時調用已經註冊好的事件處理函數。
首先要在一個類中定義某種類型的委託和此種委託類型事件。然後在該類中通過一個函數,將該事件進行觸發。 當外部其他類有對該事件訂閱時候,其他類會轉去處理該事件的處理常式。從而完成資訊的交流。這樣做,一個最大的好處就是事件觸發類不用關心該事件的所有處 理程式,只關心他自己的工作以及他所關心的事件即可。而對該事件感興趣的類會首先訂閱該事件,當該事件發生時會捕捉到事件資訊,並轉去處理。
舉一個簡單的例子 有兩個類,機器mechine類,和維修工check類。mechine類在運行過程當中如果出現某種故障,他會拋出brokendown()資訊。如果check類對該事件有訂閱,他會捕捉到該資訊然後轉去心相應的處理常式。
using System;
class Mechine //定義一個發行者類
{
public delegate void delegateName(string name); //定義具有某種傳回型別命令參數代理類型
public event delegateName eventName; //定義委託類型的事件
public void Fun()
{
if (eventName != null) //如果事件不等於空就是說有訂閱者註冊過該事件,也就是說觸發事件後有相應的事件處理函數被調用。
{
Console.WriteLine("報告,機器已經出現故障");
eventName(string _name); //在類中觸發該事件
}
}
}
class Check //有訂閱上述事件的類
{
public void Fix(string str)
{
Console.WriteLine("請讓"+str+"去進行修理");
}
}
class Program
{
static void Main()
{
Mechine mechine1 = new Mechine(); //執行個體化一個Mechine類
Check c1 = new Check();
mechine1.eventName += new Mechine.delegateName(c1.Fix);
//用當前類中Fix函數訂閱mechine類中eventName函數,注意這裡Fix的函數結構要跟事件和代理的委託要相同(形參以及傳回值全部相同),這樣當Mechine類中事件觸發時,系統會通知Check類轉到Fix函數。
Mechine.Fun("張三");
}
}
具體使用方法過程如下:
1.委託定義delegate
2.事件定義 event
3.事件觸發
4.事件訂閱以及處理
簡單的貓叫,老鼠跑,主人醒
using System;
using System.Collections.Generic;
using System.Text;
namespace DelegateEvent
{
public delegate void CatEventHandler(object sender, EventArgs e);
public class Cat
{
public event CatEventHandler CatEvent;
public void Scream(EventArgs e)
{
if (CatEvent != null) //有沒有訂閱
{
Console.WriteLine("貓叫……");
CatEvent(this, e);
}
}
public void Mouse(object sender,EventArgs e)
{
Console.WriteLine("老鼠跑……");
}
public void People(object sender, EventArgs e)
{
Console.WriteLine("主人醒……");
}
static void Main()
{
Cat cat = new Cat();
cat.CatEvent += new CatEventHandler(cat.Mouse);
cat.CatEvent += new CatEventHandler(cat.People);
cat.Scream(EventArgs.Empty);
Console.Read();
}
}
}