C#_delegate - 异步调用实例 BeginInvoke EndInvoke event

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;



namespace EventClock

{



    public class ClassWithDelegate

    { 

        //封装了一个返回值为int的多重委托方法

        public delegate int DelegateThatReturns();



        public event DelegateThatReturns theDelegate;



        public void Run()

        {

            for (; ; )

            {

                Thread.Sleep(500);



                if (theDelegate != null)

                {

                    //显式调用每个委托方法

                    foreach (DelegateThatReturns del in theDelegate.GetInvocationList())

                    {

                        //异步调用

                        //传入委托作为一个状态对象

                        del.BeginInvoke(new AsyncCallback(ResultReturns), del);

                       

                    }

                    Console.WriteLine();

                }

            }

        }

        //获取结果的回调方法

        public void ResultReturns(IAsyncResult iar)

        {

            //将状态对象转换为委托类型

            DelegateThatReturns del = (DelegateThatReturns)iar.AsyncState;

            //调用委托的EndInvoke方法获取结果

            int result = del.EndInvoke(iar);

            //显示结果

            Console.WriteLine("Delegate returned result: {0}",result);

        }

    }



    public class FirstSubscribe

    {

        private int myCounter = 0;



        public void Subscribe(ClassWithDelegate theClassWithDelegate)

        {

            theClassWithDelegate.theDelegate += new ClassWithDelegate.DelegateThatReturns(DisplayCounter);

        }



        public int DisplayCounter()

        {

            Console.WriteLine("Busy in displaying............");

            Thread.Sleep(10000);

            Console.WriteLine("Do not with work in display............");

            return ++myCounter;

        }

    }

    public class SecondSubscribe

    {

        private int myCounter = 0;



        public void Subscribe(ClassWithDelegate theClassWithDelegate)

        {

            theClassWithDelegate.theDelegate += new ClassWithDelegate.DelegateThatReturns(Doubler);

        }



        public int Doubler()

        {

            return myCounter += 2;

        }

    }





    



    class Program

    {

        static void Main(string[] args)

        {

            ClassWithDelegate theClassWithDelegate = new ClassWithDelegate();



            FirstSubscribe fs = new FirstSubscribe();

            fs.Subscribe(theClassWithDelegate);



            SecondSubscribe ss = new SecondSubscribe();

            ss.Subscribe(theClassWithDelegate);



            theClassWithDelegate.Run();

            

            Console.ReadLine();

        }

    }

}


你可能感兴趣的:(delegate)