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