什么是回調(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)就講到這里了。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注