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

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

 

  

 

转载于:https://www.cnblogs.com/moon-sunshine/archive/2013/05/22/3093455.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值