C#事件模型的一个实例

在.net设计开发过程中事件无疑是用的最多的,下面设计几个类来理解CLR事件工作机制:

C#事件模型应用场景:假设我设计一个送货上门的服务程序,当要送货时我将消息发送给送奶工或者邮递员等。

在构建应用程序时,我们先设计一个名为GoodsManager的类型负责发送消息,为GoodsManager类型定义一个对外提供名为NewGoods的事件。其它类型如"Milk"、“NewsPaper”可以订阅该事件。当GoodsManager接收到新的消息时,他将引发该事件,将消息分发给已订阅事件的对象。各个对象则以自己期望的方式来处理消息。

 
 
 
 
  1. class Program   
  2.     {   
  3.         static void Main(string[] args)   
  4.         {   
  5.             GoodsManager gm = new GoodsManager();   
  6.             Milk milk = new Milk(gm);   
  7.             NewsPaper paper = new NewsPaper();   
  8.             paper.Register(gm);   
  9.             gm.SubmitGoods("Jacky","Lily","送货上门");   
  10.   
  11.             Console.WriteLine("**************");   
  12.             //发生经济危机了取消Milk订阅   
  13.             milk.UnRegister(gm);   
  14.             gm.SubmitGoods("lily", "Peter", "送货上门");   
  15.             Console.ReadLine();   
  16.                
  17.         }   
  18.   
  19.         /// < summary>   
  20.         /// 定义一个类型用于存放发送给事件接收者的附加信息   
  21.         /// < /summary>   
  22.         internal class NewGoodsEventArgs : EventArgs   
  23.         {   
  24.             private readonly String f_From, f_To, f_Desc;   
  25.             public NewGoodsEventArgs(String from,String to,String desc)   
  26.             {   
  27.                 f_From  = from;   
  28.                 f_To    = to;   
  29.                 f_Desc  = desc;   
  30.             }   
  31.             public String From { get { return f_From; } }   
  32.             public String To { get { return f_To; } }   
  33.             public String Desc { get { return f_Desc; } }   
  34.         }   
  35.            
  36.         //定义事件成员管理类   
  37.         internal class GoodsManager   
  38.         {   
  39.             //创建线程同步锁的私有字段   
  40.             private readonly Object m_eventLock = new Object();   
  41.   
  42.             private EventHandler< NewGoodsEventArgs> m_NewGoods;   
  43.             //增加一个事件成员   
  44.             public event EventHandler< NewGoodsEventArgs> NewGoods   
  45.             {   
  46.                 //加私有锁并向委托链表增加一个处理程序   
  47.                 add { lock (m_eventLock) { m_NewGoods += value; } }   
  48.                 //显示实现Remove方法   
  49.                 remove { lock (m_eventLock) { m_NewGoods -= value; } }   
  50.             }   
  51.                
  52.             //引发事件的方法,以通知订阅者对像事件已发生。   
  53.             protected virtual void OnNewGoods(NewGoodsEventArgs e)   
  54.             {   
  55.                 EventHandler< NewGoodsEventArgs> temp = m_NewGoods;   
  56.                 if (temp != null)   
  57.                     temp(this,e);   
  58.             }   
  59.             //将输入转化为期望事件   
  60.             public void SubmitGoods(String from, String to, String desc)   
  61.             {   
  62.                 //构个对象用来通知接受者信息   
  63.                 NewGoodsEventArgs e = new NewGoodsEventArgs(from,to,desc);   
  64.                 //调用虚方法通知事件已发生   
  65.                 OnNewGoods(e);   
  66.             }   
  67.         }   
  68.   
  69.           
  70.         //监听事件的类型   
  71.         internal sealed class Milk   
  72.         {   
  73.             public Milk() { }   
  74.             public Milk(GoodsManager gm)   
  75.             {   
  76.                 gm.NewGoods += new EventHandler< NewGoodsEventArgs>(Milk_NewGoods);   
  77.             }   
  78.   
  79.             //当新的物品送到时执行此方法   
  80.             void Milk_NewGoods(object sender, NewGoodsEventArgs e)   
  81.             {   
  82.                 Console.WriteLine("Accept Milk");   
  83.                 Console.WriteLine("From:{0},To:{1},desc:{2}",e.From,e.To,e.Desc);   
  84.             }   
  85.   
  86.             public void UnRegister(GoodsManager gm)//注销事件   
  87.             {   
  88.                 gm.NewGoods -= Milk_NewGoods;   
  89.             }   
  90.             public void Register(GoodsManager gm) //订阅事件   
  91.             {   
  92.                 gm.NewGoods += Milk_NewGoods;   
  93.             }   
  94.         }   
  95.   
  96.         internal sealed class NewsPaper   
  97.         {   
  98.             public NewsPaper() { }   
  99.             public NewsPaper(GoodsManager gm)   
  100.             {   
  101.                 gm.NewGoods += new EventHandler< NewGoodsEventArgs>(Milk_NewGoods);   
  102.             }   
  103.             void Milk_NewGoods(object sender, NewGoodsEventArgs e)   
  104.             {   
  105.                 Console.WriteLine("Accept News Paper");   
  106.                 Console.WriteLine("From:{0},To:{1},desc:{2}", e.From, e.To, e.Desc);   
  107.             }   
  108.             public void UnRegister(GoodsManager gm)   
  109.             {   
  110.                 gm.NewGoods -= Milk_NewGoods;   
  111.             }   
  112.             public void Register(GoodsManager gm)   
  113.             {   
  114.                 gm.NewGoods += Milk_NewGoods;   
  115.             }   
  116.         }   
  117.     }  

C#事件模型执行结果:

C#事件模型的例子就介绍到这里。

网站栏目:C#事件模型的一个实例
地址分享:http://www.shufengxianlan.com/qtweb/news16/459166.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联