什么是回调函数?

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

现在我用例子详细看看回调函数到底怎么编写的,先看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. 23、springboot与缓存(1)

    一.JSR107 Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry. 1.CachingPro ...

  2. Git--查看,删除,添加远程分支

    1. 查看远程分支: $ git branch -a 2. 删除远程分支: $ git push origin --delete <branch name> 或者 git push --d ...

  3. Java中的监听器

    servlet的技术规范包括三个:servlet,listener,filter,今天记录一下listener的学习. 监听器就是监听某个对象的状态变化的技术.监听器包括事件源,监听器,注册监听器以及 ...

  4. Cache Buffer 区别

    Cache 一般位于CPU中, 分为 L1 Cache, L2 Cache, 是一种读的操作,把CPU刚用过的/循环使用的数据存储起来,当CPU再次使用时,可以直接从Cache存储器中调用,减少了等待 ...

  5. 纸质文稿如何生成PDF

    步骤: (1) 将即将要转换的文稿单张向下放入打印机. (2) 将打印设备(打印机)连接至你的电脑. (3) 打开控制面板,点击"查看设备和打印机". (4) 找到你当前的打印设备 ...

  6. 再论C++引用(reference)类型

    很多C++初学者搞不清楚C++引用类型,不知有什么用,所以也不知怎么用.一个问题令人迷惑,不是读者有问题,而是教科书有问题. 和多数初学者一样,笔者在初学C++时,关于引用类型,教科书上也是如下表所述 ...

  7. #leetcode刷题之路25- k个一组翻转链表

    给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表.k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 :给定这个链表:1- ...

  8. (转载)SendKeys.Send()的使用

    SendKeys.Send() 使用SendKeys将键击和组合键击发送到活动应用程序.此类无法实例化.若要发送一个键击给某个类并立即继续程序流,请使用Send.若要等待键击启动的任何进程,请使用Se ...

  9. transform动画的一个3D的正方体盒子

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 解决webview上移

    //解决webview上移 $(".webView").blur(function() { setTimeout(function() { var scrollHeight = d ...