class="code">using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Counter counter = new Counter(new Random().Next(10)); // 4. subscribe event counter.ThresholdReached += counter_ThresholdReached; Console.WriteLine("press 'a' key to increase total"); while (Console.ReadKey(true).KeyChar == 'a') { Console.WriteLine("adding one"); counter.Add(1); } } static void counter_ThresholdReached(object sender, ThresholdEventArgs e) { Console.WriteLine("Threshold " + e.ThresholdNum + " reached at time "+ e.TimeReached); } } public class Counter { int threshold; int total; public Counter(int thresholdVal) { threshold = thresholdVal; } public void Add(int x) { total += x; // 5. trigger event if (total > threshold) { ThresholdEventArgs args = new ThresholdEventArgs(); args.ThresholdNum = threshold; args.TimeReached = DateTime.Now; OnThresholdReached(this, args); } } // 1. define event public event EventHandler<ThresholdEventArgs> ThresholdReached; // 2. define OnXXX virtual method public virtual void OnThresholdReached(object sender, ThresholdEventArgs e) { EventHandler<ThresholdEventArgs> handler = ThresholdReached; if (handler != null) handler(this, e); } } // 3. define event arguments public class ThresholdEventArgs : EventArgs { public int ThresholdNum { get; set; } public DateTime TimeReached { get; set; } } }