什么是回调函数?

一个简单的例子:小明想要在京东购买一件商品。他会登陆网站选好自己的商品。然后他把这件商品放在购物车,然后开始付钱(这个表示触发,不付钱不发货(排除货到付款))。然后京东的人员收到了小明这个买商品的信号,就开始发货,选好货品之后委托快递人员送到小明手里。这就是回调。

现在我用例子详细看看回调函数到底怎么编写的,先看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();
myTimer.Elapsed += new ElapsedEventHandler(Start);
myTimer.Enabled = true;
}
public void Start(object sender, ElapsedEventArgs e)
{
cb.CallBack(rd.Next(, ));
}
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 == "")
{
Client = new ConClient.SessionServiceClient(new System.ServiceModel.InstanceContext(cbk));
Client.CallBackStart();
}
else if(SessionMode=="")
{
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);
}

最后我们看运行结果

服务端:

客户端:

回调就讲到这里了。

源码

我们一起学习WCF 第八篇回调函数的更多相关文章

  1. STM32 HAL库学习系列第8篇---回调函数总结

    普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数 对普通函数的调用: 调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返 ...

  2. [老老实实学WCF] 第八篇 实例化

    老老实实学WCF 第八篇 实例化 通过上一篇的学习,我们简单地了解了会话,我们知道服务端和客户端之间可以建立会话连接,也可以建立非会话连接,通信的绑定和服务协定的 ServiceContract 的S ...

  3. Objective-C学习笔记 利用协议实现回调函数

    来源:http://mobile.51cto.com/iphone-278354.htm Objective-C学习笔记 利用协议实现回调函数是本文要介绍的内容,主要是实现一个显示文字为测试的视图,然 ...

  4. 我们一起学习WCF 第三篇头消息验证用户身份

    前言:今天我主要写的是关于头消息的一个用处验证用户信息 下面我画一个图,可以先看图 第一步:我们先开始做用户请求代码 首先:创建一个可执行的上下文对象块并定义内部传输的通道 using (Operat ...

  5. Egret入门学习日记 --- 第八篇(书中 2.0~2.6节 内容)

    第八篇(书中 2.0~2.6节 内容) 好!开始把前三章的内容录入进来. 但是!由于第一章说的内容都是在介绍白鹭引擎的背景信息,我就不在日记中写了. 直接开始从第二章写起. 2.0节 中提到了IDE( ...

  6. Silverlight中异步调用WCF服务,传入回调函数

    以前学的ASP.NET,调用的都是同步方法,同步方法的好处就是,一步一步走,完成这步才会走下一步.然而,WCF使用的都是异步方法,调用之后不管有没有获得结果就直接往下走,最可恶的是异步函数都是Void ...

  7. Noah的学习笔记之Python篇:函数“可变长参数”

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  8. Cocos Creator学习三:生命周期回调函数

    1.目的:学习生命周期回调函数以及回调顺序,更有利于我们逻辑的处理把控. 2.生命周期回调函数: 节点:指cc.Node:组件:指cc.Component. ①onLoad:脚本组件绑定的节点所在场景 ...

  9. C++学习笔记(八):函数重载、函数指针和函数对象

    函数重载 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于 ...

随机推荐

  1. yii2.0 联表查询数据库报错:undefined index order_id

    1.在查询时加了->select();如下,要加上order_id,即关联的字段(比如:order_id)比如要在select中,否则会报错:undefined index order_id / ...

  2. Vue系列——在vue项目中使用echarts

    该示例使用 vue-cli 脚手架搭建 安装echarts依赖 npm install echarts -S 或者使用国内的淘宝镜像安装 npm install -g cnpm --registry= ...

  3. Java8 Stream()关于在所有用户的所有上传记录中,找出每个用户最新上传记录

    原创文章:转载请标明出处 https://www.cnblogs.com/yunqing/p/9504196.html 首先分析相当于如下,在所有的猫中,每个名字的猫都保留年龄最小的一个 import ...

  4. Luogu_4886 快递员

    Luogu_4886 快递员 一道淀粉质的题目. 先考虑最简单的算法,那便是对每个点都求一边.时间复杂度O(NM) 然后如果我们把每个点的结果对应一个高度,我们会发现.最优解是在这个对应高度形成的三维 ...

  5. 怎样卸载wineQQ?

    好久没实用ubuntu系统的wineqq了.今天用的时候,提示无法使用,要求官网又一次下载新版本号,  感觉挺麻烦的,准备卸载,半天卸载不了. 经过努力,终于还是卸载了. 卸载命令: sudo dpk ...

  6. SQL引用DAL

    步骤:https://www.cnblogs.com/grom/articles/8981116.html 异常: 解决方案: 执行 ALTER DATABASE [DBName] SET TRUST ...

  7. shell习题第5题:批量更改文件后缀名

    [题目要求] 找到123/目录下所有后缀名为.txt的文件 1. 批量修改.txt为.txt.bak 2. 把所有.bak文件打包压缩为123.tar.gz 3. 批量还原文件的名字,即把增加的.ba ...

  8. MySQL----navicat for mysql(破解版)可视化数据库操作

    本博文介绍破解版navicat for mysql的安装方法及常用操作 navicat for mysql是一个专业的MySQL数据库图形化界面工具. 百度云下载地址:https://pan.baid ...

  9. thinkphp3.2+cropper上传多张图片剪切图片

    实现效果截图 点加号可以继续上传第二张图片 代码部<--引入cropper相关文件--> <link rel="stylesheet" href="/h ...

  10. java.io.FileNotFoundException:file:\D:\code\xml-load\target\XX.jar!\XXX(文件名、目录名或卷标语法不正确。)

    1.当使用Spring Boot将应用打成jar时,需要读取resources目录下配置文件时,通常使用ClassLoader直接读取,通常建议使用这种方式,直接将xml文件读成流传入 // 加载xm ...