Поделиться через


Events using delegates (c#) – An additional example

A former colleague wrote an excellent blog post about using Events with Delegates, in C#. He is one of the smartest people I know and very active in the community, with a deep understanding of a dozen technologies with never ending passion for technology. I haven't found a simpler example on the web yet. I wanted to add an additional real world example written in ASP.net – The example is of a News paper (Publisher) and Customers (Subscribers). Here it is:

    1: /* Event delegation works on the Publisher <-> Subscriber Model. The Publisher exposes events that clients who are interested can subscribe
    2:  * to and when an event occurs, the subscribers are notified.
    3:  * If we were to consider a common real world example, we could think of implementing a Newspapaer and its Subscibers
    4:  * The code below implements the Newspaper as the Publisher and its Subscribers as customers who subscribe to be notified of breaking news.
    5:  */
    6:  
    7: using System;
    8: using System.Web;
    9:  
   10: namespace Example4
   11: {
   12:     public partial class EventsDemo : System.Web.UI.Page
   13:     { 
   14:         protected void Page_Load(object sender, EventArgs e)
   15:         {
   16:             //We will first instantiate our Publisher - Which is our news paper - TimesOfIndia
   17:             TimesOfIndia TOI = new TimesOfIndia();
   18:  
   19:             //Add subscribers
   20:             TOICustomer Sudeepg = new TOICustomer(TOI, "Sudeepg");
   21:             TOICustomer Jack    = new TOICustomer(TOI, "Jack");
   22:             TOICustomer George  = new TOICustomer(TOI, "George");
   23:  
   24:             //Times now will get the breaking news for us
   25:             TOI.getBreakingNews();
   26:         }
   27:     }
   28:  
   29:     //This is our public delegate that will be hooked up by our subscribers.
   30:     public delegate void BreakingNewsEventHandler(object sender, BreakingNewsEventArgs e);
   31:  
   32:     public class TimesOfIndia  // Times of india news paper is our publisher.
   33:     {
   34:         public event BreakingNewsEventHandler breakingNewsNotifyList;
   35:  
   36:         public void getBreakingNews()
   37:         {
   38:             string BreakingNews = "Annual Sale - Best deals on electronic devices!";   //Sample breaking news
   39:  
   40:             //Display the breaking news - NOTE: The Marquee tag only works in IE. Remove it for other browsers.
   41:             HttpContext.Current.Response.Write("<h1><marquee> Current Breaking News : " + BreakingNews.ToString() + "</marquee></h1><hr />");
   42:  
   43:             //Create and add event args
   44:             BreakingNewsEventArgs e = new BreakingNewsEventArgs(BreakingNews);
   45:  
   46:             //We need to invoke the notification, ONLY if there are subscribers to breaking news notification. That's why we check for NULL.
   47:             if (breakingNewsNotifyList != null)
   48:                 breakingNewsNotifyList(this, e);
   49:  
   50:         }
   51:     }
   52:  
   53:     public class BreakingNewsEventArgs : EventArgs      //Class used to pass data to event consumers when sending notification.
   54:     {
   55:         public BreakingNewsEventArgs(string BreakingNews)
   56:         {
   57:             this.m_BreakingNews = BreakingNews;         //Save the breaking news into a property.
   58:         }
   59:  
   60:         string m_BreakingNews = "";
   61:         public string BreakingNews      //Data we are passing to consumers is the breaking news itself (Stored as property).
   62:         {
   63:             get { return m_BreakingNews; }
   64:         }
   65:     }
   66:  
   67:  
   68:     public class TOICustomer        //Instances of this class will be the subscribers of Times of India (Publisher).
   69:     {
   70:         private TimesOfIndia TOI;               //Copy of the newsPaper
   71:         private string m_CustomerName = "";     //Store the customer name
   72:  
   73:         public TOICustomer(TimesOfIndia TOICopy, string customerName)
   74:         {
   75:             this.TOI = TOICopy;
   76:             m_CustomerName = customerName;
   77:             TOI.breakingNewsNotifyList += new BreakingNewsEventHandler(OnRecvBreakingNews);  //Subscribe to breaking news notification
   78:         }
   79:  
   80:         //This method will be invoked upon a breaking news Notification.
   81:         private void OnRecvBreakingNews(object sender, BreakingNewsEventArgs e)
   82:         {
   83:             HttpContext.Current.Response.Write(m_CustomerName + " Acknowledging breaking news : " + e.BreakingNews.ToString() + "<br />");
   84:         }
   85:     }
   86: }

Comments

  • Anonymous
    January 21, 2010
    Lot of thanks for sharing your colleague's post. Really it is very for me