How to: Raise and Consume Events

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; }
    }
}
posted @ 2014-08-11 21:13  PengpengSong  阅读(243)  评论(0编辑  收藏  举报