什么是回调函数?
一个简单的例子:小明想要在京东购买一件商品。他会登陆网站选好自己的商品。然后他把这件商品放在购物车,然后开始付钱(这个表示触发,不付钱不发货(排除货到付款))。然后京东的人员收到了小明这个买商品的信号,就开始发货,选好货品之后委托快递人员送到小明手里。这就是回调。
现在我用例子详细看看回调函数到底怎么编写的,先看UML图
开始编码:
第一步:创建一个契约
[ServiceContract(sessionMode =SessionMode.Required)]publicinterfaceISessionService
{
[OperationContract(IsOneWay=true, IsInitiating =true, IsTerminating =false)]voidCallBackStart();
[OperationContract(IsOneWay=true, IsInitiating =true, IsTerminating =true)]voidCallBackEnd();
}
注释1:IsInitiating = true表示开启会话 IsTerminating =true表示收到消息后(如果存在)就关闭会话
第二步:实现契约
PRivateTimer myTimer =null;
Random rd=newRandom();privateIcallBack cb;publicvoidCallBackStart()
{
cb= OperationContext.Current.GetCallbackChannel<IcallBack>();
Console.WriteLine("会话ID{0}", OperationContext.Current.SessionId);
myTimer=newTimer(2000);
myTimer.Elapsed+=newElapsedEventHandler(Start);
myTimer.Enabled=true;
}publicvoidStart(objectsender, ElapsedEventArgs e)
{
cb.CallBack(rd.Next(1,1000000));
}publicvoidDispose()
{
myTimer.Dispose();
Console.WriteLine("服务实例已释放 {0}", DateTime.Now.ToString());
}publicvoidCallBackEnd()
{
Console.WriteLine("{0}:会话即将停止。",OperationContext.Current.SessionId);
}
}
注释2:Timer是一个定时器显示 用random产生随机数。
第三步:创建一个回调接口
[ServiceContract]publicinterfaceIcallBack
{
[OperationContract(IsOneWay=true)]voidCallBack(intValue);
}
第四步:客户端实现回调接口
首先客户端建一个类实现回调接口但是我们发现报下列一个错误
最后检查发现服务端 并没有加上回调接口然后我们在契约在加上CallbackContract=typeof(IcallBack)然后在进行引用发现没有问题了
publiceventEventHandler CallBackEvent;publicvoidCallBack(intValue)
{if(CallBackEvent !=null)
{
TimeEventArg Tea=newTimeEventArg();
Tea.Value=Value.ToString();
CallBackEvent(this,Tea);
}
}
注释3:CallBackEvent是我们定义的一个事件,进行把服务器传来的数值返回给客户端
第五步:客户端进行调用
ConClient.SessionServiceClient Client =null;
CallBackHandler cbk=newCallBackHandler();
cbk.CallBackEvent+=cb_ValueCallbacked;
Console.WriteLine("请选择会话模式:0表示开始,1表示关闭");while(true)
{stringSessionMode =Console.ReadLine();if(SessionMode =="0")
{
Client=newConClient.SessionServiceClient(newSystem.ServiceModel.InstanceContext(cbk));
Client.CallBackStart();
}elseif(SessionMode=="1")
{if(Client !=null)
{
Client.CallBackEnd();
}
}
}
}publicstaticvoidcb_ValueCallbacked(objectsender,EventArgs e)
{
Console.ForegroundColor=ConsoleColor.Green;
TimeEventArg Tea=newTimeEventArg();
Tea=(TimeEventArg)e;
Console.WriteLine(Tea.Value);
}
最后我们看运行结果
服务端:
客户端:
回调就讲到这里了。
源码