什么是回調函數?
一個簡單的例子:小明想要在京東購買一件商品。他會登陸網站選好自己的商品。然后他把這件商品放在購物車,然后開始付錢(這個表示觸發,不付錢不發貨(排除貨到付款))。然后京東的人員收到了小明這個買商品的信號,就開始發貨,選好貨品之后委托快遞人員送到小明手里。這就是回調。
現在我用例子詳細看看回調函數到底怎么編寫的,先看UML圖
開始編碼:
第一步:創建一個契約
[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表示開啟會話 IsTerminating =true表示收到消息后(如果存在)就關閉會話
第二步:實現契約
PRivate Timer myTimer = null; Random rd = new Random(); private IcallBack cb; public void CallBackStart() { cb = OperationContext.Current.GetCallbackChannel<IcallBack>(); Console.WriteLine("會話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("服務實例已釋放 {0}", DateTime.Now.ToString()); } public void CallBackEnd() { Console.WriteLine("{0}:會話即將停止。",OperationContext.Current.SessionId); } }
注釋2:Timer是一個定時器顯示 用random產生隨機數。
第三步:創建一個回調接口
[ServiceContract] public interface IcallBack { [OperationContract(IsOneWay = true)] void CallBack(int Value); }
第四步:客戶端實現回調接口
首先客戶端建一個類實現回調接口但是我們發現報下列一個錯誤
最后檢查發現服務端 并沒有加上回調接口然后我們在契約在加上CallbackContract=typeof(IcallBack)然后在進行引用發現沒有問題了
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是我們定義的一個事件,進行把服務器傳來的數值返回給客戶端
第五步:客戶端進行調用
ConClient.SessionServiceClient Client = null; CallBackHandler cbk = new CallBackHandler(); cbk.CallBackEvent += cb_ValueCallbacked; Console.WriteLine("請選擇會話模式:0表示開始,1表示關閉"); 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); }
最后我們看運行結果
服務端:
客戶端:
回調就講到這里了。
新聞熱點
疑難解答