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: }