我们一起学习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++学习笔记(八):函数重载、函数指针和函数对象
函数重载 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于 ...
随机推荐
- PHP-----TP框架----命名空间
TP框架----命名空间 命名空间,起什么作用??? [1]命名空间是一个虚拟的目录,这个文件有可能存在这个电脑里的任何一个地方,但是如果要把这个文件它的命名空间全部写成同一个那么这些文件就相当于在同 ...
- python沙箱逃逸的几道题
第一道 from __future__ import print_function print("Welcome to my Python sandbox! Enter commands b ...
- npm run dev启动项目报错 Cannot find module 'webpack-cli/bin/config-yargs'
一般是webpack的版本和webpackserver的版本不兼容导致的错误. 解决方法是先卸载这两个版本,再安装指定的版本. 卸载: 再安装指定或者最新版本的webpack和webpack-dev- ...
- .gitignore设置不生效
.gitignore git中,如果想要让git忽略某些文件,或不想push到远程库,不让其受版本的控制.可以使用git提供的.gitignore文件进行配置.像这样: 一般情况下,在文件还未修改前, ...
- LeetCode36.有效的数独 JavaScript
判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 ...
- #leetcode刷题之路19-删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点.示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1-& ...
- 【转】Linux常用命令大全(非常全!!!)
最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短小但却功能强大.我将我了解到的命令列举一 ...
- js节点操作实例
写了一个简单的小例子来引用js实例 1. 初步节点操作: 2.兼容性节点操作: 3.节点的类型,名字: 4.使用setAttribute设置属性 5.节点复制操作: 6.删除和替换节点 如有错误,还望 ...
- flAbsPath on /var/lib/dpkg/status failed 解决 Cydia 红字
越狱之后抹掉所有数据,然后再使用 doubleH3lix 越狱成功后,打开 Cydia 会提示如下错误: flAbsPath on /var/lib/dpkg/status failed - real ...
- AFNetworking 2.x 的SSL身份认证
一般来讲如果app用了web service , 我们需要防止数据嗅探来保证数据安全.通常的做法是用ssl来连接以防止数据抓包和嗅探 其实这么做的话还是不够的.我们还需要防止中间人攻击(不明白的自己去 ...