我们一起学习WCF 第八篇回调函数
什么是回调函数?
一个简单的例子:小明想要在京东购买一件商品。他会登陆网站选好自己的商品。然后他把这件商品放在购物车,然后开始付钱(这个表示触发,不付钱不发货(排除货到付款))。然后京东的人员收到了小明这个买商品的信号,就开始发货,选好货品之后委托快递人员送到小明手里。这就是回调。
现在我用例子详细看看回调函数到底怎么编写的,先看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 第八篇回调函数的更多相关文章
- STM32 HAL库学习系列第8篇---回调函数总结
普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数 对普通函数的调用: 调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返 ...
- [老老实实学WCF] 第八篇 实例化
老老实实学WCF 第八篇 实例化 通过上一篇的学习,我们简单地了解了会话,我们知道服务端和客户端之间可以建立会话连接,也可以建立非会话连接,通信的绑定和服务协定的 ServiceContract 的S ...
- Objective-C学习笔记 利用协议实现回调函数
来源:http://mobile.51cto.com/iphone-278354.htm Objective-C学习笔记 利用协议实现回调函数是本文要介绍的内容,主要是实现一个显示文字为测试的视图,然 ...
- 我们一起学习WCF 第三篇头消息验证用户身份
前言:今天我主要写的是关于头消息的一个用处验证用户信息 下面我画一个图,可以先看图 第一步:我们先开始做用户请求代码 首先:创建一个可执行的上下文对象块并定义内部传输的通道 using (Operat ...
- Egret入门学习日记 --- 第八篇(书中 2.0~2.6节 内容)
第八篇(书中 2.0~2.6节 内容) 好!开始把前三章的内容录入进来. 但是!由于第一章说的内容都是在介绍白鹭引擎的背景信息,我就不在日记中写了. 直接开始从第二章写起. 2.0节 中提到了IDE( ...
- Silverlight中异步调用WCF服务,传入回调函数
以前学的ASP.NET,调用的都是同步方法,同步方法的好处就是,一步一步走,完成这步才会走下一步.然而,WCF使用的都是异步方法,调用之后不管有没有获得结果就直接往下走,最可恶的是异步函数都是Void ...
- Noah的学习笔记之Python篇:函数“可变长参数”
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- Cocos Creator学习三:生命周期回调函数
1.目的:学习生命周期回调函数以及回调顺序,更有利于我们逻辑的处理把控. 2.生命周期回调函数: 节点:指cc.Node:组件:指cc.Component. ①onLoad:脚本组件绑定的节点所在场景 ...
- C++学习笔记(八):函数重载、函数指针和函数对象
函数重载 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于 ...
随机推荐
- iOS沙盒目录文件操作
简介 沙盒(NSHomeDirectory())中总共有四个文件夹,documents.tmp.app.Library; 手动保存的文件在documents文件里; Nsuserdefaults保存的 ...
- python3对数据库的基本操作
其实Python同Java一样,都有对JDBC操作的API. 注意:我的Python版本为3.6.5 Python2.7是应用比较广的,百度博客上很多相关的例子,所以本次不再列出. 只要是用过Java ...
- 基于Azure Blob冷存储的数据压缩备份总结
基于上一篇的压缩算法对比分析报告,选择了LZ4算法的普通模式,其测试压缩率为28%,20G压缩时间为256s,估计1T的冷备时间为3.5h. 接下来,将23T的HBase历史数据进行了压缩冷备,压缩后 ...
- sublime text3插件的安装
1.安装Package Control提示Package Control:There are no packages available for installation, 解决方案:删除Packag ...
- Linux 启动进程结束进程通用代码
linux启动springboot项目 start.sh #!/bin/sh rm -f tpid nohup java -jar restDate--SNAPSHOT.jar --spring.pr ...
- 前端基础-BOM和DOM的介绍
阅读目录 BOM和DOM的简述 DOM详细操作 事件 一.BOM和DOM的简述 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我 ...
- 【2017 ICPC亚洲区域赛北京站 J】Pangu and Stones(区间dp)
In Chinese mythology, Pangu is the first living being and the creator of the sky and the earth. He w ...
- Navicat 12 连接 Mysql8.0 使用日志
目前最新的Mysql8.0 + Navicat12,使用中常有一些棘手问题 解决了的都会贴出来,受益于小伙伴们 我们的目标是发现问题,解决问题,欢迎大家贴出自己使用时遇到的问题,集思广益 好了,上干货 ...
- linux 学习第十六天(Samba配置)
Samba 服务 yum install samba mv smb.conf smb.conf.bak cat smb.conf.bak | grep -v "#" | grep ...
- ionic2添加支付宝插件出现问题
安装本地路径插件正常 编译正常 在打开支付页面时候 就报这个错 在手机app点击无效 错误信息: ERROR Error: Uncaught (in promise): Error: No pro ...