用Delegate完成异步调用
- delegate可用于对方法的应用,它可以作为方法的参数出现,也可以作为类的成员出现,尤其在地步调用中,delegate可以定义回调方法:
public class AsncInvoker { //记录异步执行的结果 public IList<string> output = new List<string>(); public AsncInvoker() { Timer slowTimer = new Timer(new TimerCallback(OnTimerInerval), "slow", 2500,2500); Timer fastTimer = new Timer(new TimerCallback(OnTimerInerval), "fast", 2500,2500); output.Add("method"); } private void OnTimerInerval(object state) { output.Add(state as string); } public IList<string> Output { get { return output; } } }
Unit test:
[TestMethod()] public void test() { AsncInvoker asy = new AsncInvoker(); Thread.Sleep(3000); Assert.AreEqual<string>("method", asy.Output[0]); Assert.AreEqual<string>("fast", asy.Output[1]); Assert.AreEqual<string>("slow", asy.Output[2]); }ow", asy.Output[2]);
在上面的例子中,TimerCallbak就是一个delegate,它定义了每个Timer触发时需要回调的方法,上面顺序先是主流程执行,跟着是两个timer快慢执行。除此之外,上例子中还表达了一个重要的意图:delegate是对具体方法的抽象,它屏蔽了delegate的调用者与实际执行方法间的关联关系。如,上面的调用者是timer,而执行着确实Asyncinvoker中中的ontimerinterval方法。很多行为模式可以采用此类操作方式表示。