How to: Raise and Consume Events

8898 ワード

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

    }

}