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