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