c# 委托与事件(二)之异步调用

 

  在委托与事件(一)中,学习了委托和事件的使用,用的是委托的同步调用。有时候委托绑定的方法执行完成时间可能较长的任务,如打开大文件、连接远程计算机或查询数据库,这时为了提高效率通常使用异步调用。异步操作在主应用程序线程以外的线程中执行。应用程序调用方法异步执行某个操作时,应用程序可在异步方法执行其任务时继续执行。在之前的猫和老鼠例子中,修改cat类中的CatShout的调用方式,即可实现异步调用。

namespace PracticeCsharp
{
    class Cat
    {
        private string name;
        public Cat(string name)
        {
            this.name = name;
        }

        public delegate void CatShoutEventHandler();

        public event CatShoutEventHandler CatShout;

        public void Shout()
        {
            if(CatShout!= null)
            {
                //CatShout();    // 之前的同步调用
                /*当event CatShout 在外部有多处绑定时(MutilDelegate),需要先使用event 对象的GetInvocationList()方法获取绑定方法的列表,再遍历列表,依次对绑定的方法进
                行异步调用。如果只是event只是绑定一个方法,则可以直接使用BeginInvoke进行异步调用:CatShout.BeginInvoke(null, null)*/
                var reveivers = CatShout.GetInvocationList();
                foreach (CatShoutEventHandler reveiver in reveivers)
                {
                    reveiver.BeginInvoke(null, null);
                }
            }
        }
    }

    class Mouse
    {
        private string name;
        public Mouse(string name)
        {
            this.name = name;
        }

        public void Run()
        {
            Thread.Sleep(1000);
            Console.WriteLine("Cat is coming,{0} is hurry to run", name);
        }
    }

    class DelegateTest
    {
        public static void Main()
        {
            Cat cat = new Cat("Tom");
            Mouse mouse1 = new Mouse("Jerry");
            Mouse mouse2 = new Mouse("Jack");

       //event绑定多个方法。
            cat.CatShout += mouse1.Run; 
            cat.CatShout += mouse2.Run;
            cat.Shout();
            Console.WriteLine("Mian thread has completed!");
            Console.Read();
        }
    }
}
  

 

  

 

posted @ 2013-05-22 22:55  月光-日光海岸  阅读(251)  评论(0编辑  收藏  举报