国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

我們一起學(xué)習(xí)WCF第八篇回調(diào)函數(shù)

2019-11-14 15:53:58
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  什么是回調(diào)函數(shù)?

一個(gè)簡(jiǎn)單的例子:小明想要在京東購(gòu)買一件商品。他會(huì)登陸網(wǎng)站選好自己的商品。然后他把這件商品放在購(gòu)物車,然后開(kāi)始付錢(這個(gè)表示觸發(fā),不付錢不發(fā)貨(排除貨到付款))。然后京東的人員收到了小明這個(gè)買商品的信號(hào),就開(kāi)始發(fā)貨,選好貨品之后委托快遞人員送到小明手里。這就是回調(diào)。

現(xiàn)在我用例子詳細(xì)看看回調(diào)函數(shù)到底怎么編寫的,先看UML圖

開(kāi)始編碼:

 第一步:創(chuàng)建一個(gè)契約

 [ServiceContract(sessionMode = SessionMode.Required)]   public interface ISessionService    {        [OperationContract(IsOneWay = true, IsInitiating = true, IsTerminating = false)]        void CallBackStart();        [OperationContract(IsOneWay = true, IsInitiating = true, IsTerminating = true)]        void CallBackEnd();    }

注釋1:IsInitiating = true表示開(kāi)啟會(huì)話 IsTerminating =true表示收到消息后(如果存在)就關(guān)閉會(huì)話

第二步:實(shí)現(xiàn)契約

 PRivate Timer myTimer = null;        Random rd = new Random();        private IcallBack cb;        public void CallBackStart()        {            cb = OperationContext.Current.GetCallbackChannel<IcallBack>();            Console.WriteLine("會(huì)話ID{0}", OperationContext.Current.SessionId);            myTimer = new Timer(2000);                       myTimer.Elapsed += new ElapsedEventHandler(Start);            myTimer.Enabled = true;        }        public void Start(object sender, ElapsedEventArgs e)        {            cb.CallBack(rd.Next(1, 1000000));        }       public void Dispose()        {            myTimer.Dispose();            Console.WriteLine("服務(wù)實(shí)例已釋放     {0}", DateTime.Now.ToString());          }             public void CallBackEnd()        {         Console.WriteLine("{0}:會(huì)話即將停止。",OperationContext.Current.SessionId);        }    }

注釋2:Timer是一個(gè)定時(shí)器顯示 用random產(chǎn)生隨機(jī)數(shù)。

第三步:創(chuàng)建一個(gè)回調(diào)接口

 [ServiceContract]    public interface IcallBack    {        [OperationContract(IsOneWay = true)]        void CallBack(int Value);    }

第四步:客戶端實(shí)現(xiàn)回調(diào)接口

首先客戶端建一個(gè)類實(shí)現(xiàn)回調(diào)接口但是我們發(fā)現(xiàn)報(bào)下列一個(gè)錯(cuò)誤

最后檢查發(fā)現(xiàn)服務(wù)端 并沒(méi)有加上回調(diào)接口然后我們?cè)谄跫s在加上CallbackContract=typeof(IcallBack)然后在進(jìn)行引用發(fā)現(xiàn)沒(méi)有問(wèn)題了

  public event EventHandler CallBackEvent;       public void CallBack(int Value)       {           if (CallBackEvent != null)           {               TimeEventArg Tea = new TimeEventArg();               Tea.Value = Value.ToString();               CallBackEvent(this,Tea);           }       }

注釋3:CallBackEvent是我們定義的一個(gè)事件,進(jìn)行把服務(wù)器傳來(lái)的數(shù)值返回給客戶端

第五步:客戶端進(jìn)行調(diào)用

 ConClient.SessionServiceClient Client = null;            CallBackHandler cbk = new CallBackHandler();            cbk.CallBackEvent += cb_ValueCallbacked;            Console.WriteLine("請(qǐng)選擇會(huì)話模式:0表示開(kāi)始,1表示關(guān)閉");            while(true)            {                string SessionMode = Console.ReadLine();                if (SessionMode == "0")                {                    Client = new ConClient.SessionServiceClient(new System.ServiceModel.InstanceContext(cbk));                    Client.CallBackStart();                }                else if(SessionMode=="1")                {                    if (Client != null)                    {                        Client.CallBackEnd();                    }                }            }                   }        public static void cb_ValueCallbacked(object sender,EventArgs e)        {            Console.ForegroundColor = ConsoleColor.Green;            TimeEventArg Tea = new TimeEventArg();            Tea = (TimeEventArg)e;            Console.WriteLine(Tea.Value);        }

最后我們看運(yùn)行結(jié)果

服務(wù)端:

客戶端:

回調(diào)就講到這里了。

源碼

 


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 封丘县| 廊坊市| 白沙| 临清市| 平昌县| 望都县| 高要市| 岚皋县| 五峰| 盘锦市| 雅江县| 剑川县| 临颍县| 临夏县| 九龙坡区| 延长县| 湖口县| 略阳县| 忻州市| 佛山市| 丹东市| 惠安县| 西乡县| 竹北市| 隆德县| 绥中县| 绥化市| 高州市| 安国市| 石泉县| 宜丰县| 章丘市| 高邑县| 镇远县| 永康市| 卢氏县| 全椒县| 湘阴县| 嵩明县| 万安县| 青冈县|