我们一起学习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++学习笔记(八):函数重载、函数指针和函数对象
函数重载 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于 ...
随机推荐
- 23、springboot与缓存(1)
一.JSR107 Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry. 1.CachingPro ...
- Git--查看,删除,添加远程分支
1. 查看远程分支: $ git branch -a 2. 删除远程分支: $ git push origin --delete <branch name> 或者 git push --d ...
- Java中的监听器
servlet的技术规范包括三个:servlet,listener,filter,今天记录一下listener的学习. 监听器就是监听某个对象的状态变化的技术.监听器包括事件源,监听器,注册监听器以及 ...
- Cache Buffer 区别
Cache 一般位于CPU中, 分为 L1 Cache, L2 Cache, 是一种读的操作,把CPU刚用过的/循环使用的数据存储起来,当CPU再次使用时,可以直接从Cache存储器中调用,减少了等待 ...
- 纸质文稿如何生成PDF
步骤: (1) 将即将要转换的文稿单张向下放入打印机. (2) 将打印设备(打印机)连接至你的电脑. (3) 打开控制面板,点击"查看设备和打印机". (4) 找到你当前的打印设备 ...
- 再论C++引用(reference)类型
很多C++初学者搞不清楚C++引用类型,不知有什么用,所以也不知怎么用.一个问题令人迷惑,不是读者有问题,而是教科书有问题. 和多数初学者一样,笔者在初学C++时,关于引用类型,教科书上也是如下表所述 ...
- #leetcode刷题之路25- k个一组翻转链表
给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表.k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 :给定这个链表:1- ...
- (转载)SendKeys.Send()的使用
SendKeys.Send() 使用SendKeys将键击和组合键击发送到活动应用程序.此类无法实例化.若要发送一个键击给某个类并立即继续程序流,请使用Send.若要等待键击启动的任何进程,请使用Se ...
- transform动画的一个3D的正方体盒子
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 解决webview上移
//解决webview上移 $(".webView").blur(function() { setTimeout(function() { var scrollHeight = d ...