简介的异步通讯机制-委托(delegate)

用Delegate完成异步调用

  1. 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方法。很多行为模式可以采用此类操作方式表示。

posted @ 2016-08-21 16:48  可可木西  阅读(254)  评论(0编辑  收藏  举报