软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础。

一、回调函数

调用(calling)机制从汇编时代起已经大量使用:准备一段现成的代码,调用者可以随时跳转至此段代码的起始地址,执行完后再返回跳转时的后续地址。 CPU为此准备了现成的调用指令,调用时可以压栈保护现场,调用结束后从堆栈中弹出现场地址,以便自动返回。借堆栈保护现场真是一项绝妙的发明,它使调用者和被调者可以互不相识,于是才有了后来的函数和构件。

此调用机制并非完美。回调函数就是一例。函数之类本是为调用者准备的美餐,其烹制者应对食客了如指掌,但实情并非如此。例如,写一个快速排序函数供他人调用,其中必包含比较大小。麻烦来了:此时并不知要比较的是何类数据--整数、浮点数、字符串?于是只好为每类数据制作一个不同的排序函数。更通行的办法是在函数参数中列一个回调函数地址,并通知调用者:君需自己准备一个比较函数,其中包含两个指针类参数,函数要比较此二指针所指数据之大小,并由函数返回值说明比较结果。排序函数借此调用者提供的函数来比较大小,借指针传递参数,可以全然不管所比较的数据类型。被调用者回头调用调用者的函数(够咬嘴的),故称其为回调(callback)。

使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。至于如何定义回调函数,跟具体使用的 API函数有关,一般在帮助中有说明回调函数的参数和返回值等。C 中一般要求在回调函数前加CALLBACK(相当于FAR PASCAL),这主要是说明该函数的调用方式。

精妙比喻:回调函数还真有点像您随身带的BP机:告诉别人号码,在它有事情时Call您。

回调用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调,例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处理工作外,还将进行回调,将这个数据交给上层应用层来做进一步处理,这在分层的数据通信中很普遍。其实回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反,他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装,这个安装函数其实就是一个低层提供的API,安装后低层不知道这个回调的名字,但它通过一个函数指针来保存这个回调,在需要调用时,只需引用这个函数指针和相关的参数指针。其实:回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。

也可以这样,更容易理解:回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。为此,你需要做三件事:

1. 声明;
2. 定义;
3. 设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于系统调用。

同步调用、异步调用和回调函数相关推荐

  1. C# 委托的三种调用示例(同步调用 异步调用 异步回调)

    首先,通过代码定义一个委托和下面三个示例将要调用的方法: 复制代码 代码如下: public delegate int AddHandler(int a,int b);     public clas ...

  2. Dubbo 同步、异步调用的几种方式

    我们知道,Dubbo 缺省协议采用单一长连接,底层实现是 Netty 的 NIO 异步通讯机制:基于这种机制,Dubbo 实现了以下几种调用方式: 同步调用 异步调用 参数回调 事件通知 同步调用 同 ...

  3. 浅谈WebService开发二(同步与异步调用)转

    上文 <http://www.dotnetgeek.cn/xuexiwebservice1.html>已经跟大家说了,如果创建一个webservice和简单的调用,本文将注重webserv ...

  4. ajax 同步_第3部分-0:同步和异步,还有回调需要了解一下

    同步是什么 异步是什么 异步场景: (1)定时任务 (2)网络请求:Ajax .图片加载 全面分析前端的网络请求方式 (3)事件绑定 异步产生知识点: 进程和线程 单线程 记一次 Vue 移动端活动倒 ...

  5. json,异步加载,回调函数

    json,异步加载,回调函数 json文件格式 json文件格式传送的是对象 但是服务器接收以及发送的都是文本,Linux系统中飞的都是文本.. json文件中的对象属性名都要双引号包裹起来,以区别一 ...

  6. C#的同步和异步调用方法

    同步和异步大家都明白什么意思,在这里不多介绍了. namespace ConsoleTest {class Program{static void Main(string[] args){Consol ...

  7. OC代码调用C++代码的回调函数步骤

    http://hi.baidu.com/52study/item/82ed1838b96725b7b80c033f?connect=qzone 1.C++代码中的回调函数 在C++的头文件中声明回调函 ...

  8. c语言调用go函数,C中调用go中的回调函数

    在用go包装某些c库时(如glut),需要将go函数当作回调函数传递给c库(如glutDisplayFunc(&draw)中的draw函数,我想将go写的函数传过去),应该怎么做?我写了一个示 ...

  9. JS 异步发展流程(回调函数=Async/await)

    异步编程的语法目标,就是怎样让它更像同步编程 什么是异步? 异步任务指的是,不进入主线程.而进入"任务队列"(task queue)的任务,只有"任务队列"通知 ...

  10. 按照顺序执行异步ajax的回调函数

    //按顺序执行多个ajax命令,因为数量不定,所以采用递归 function send(action, arg2) {//将多个命令按顺序封装成数组对象,递归执行//利用了deferred对象控制回调 ...

最新文章

  1. [导入]ZT笑到内伤:史上最雷,最爆寒的电影字幕
  2. 手机+笔记本上NET网教程--5步让你轻松上网
  3. debstack 安装 openstack
  4. Linux系统之高级用户组和权限管理
  5. sas sql中有类似mysql的 g_SAS中的SQL
  6. 判断大小简单算法_算法浅谈——人人皆知却很多人写不对的二分法
  7. vmvare连接linux
  8. (转)基于MVC4+EasyUI的Web开发框架经验总结(2)- 使用EasyUI的树控件构建Web界面...
  9. 无人机在倾斜摄影时丢片的解决方案
  10. javaScript 对象访问属性的另一种方式
  11. nginx location 配置
  12. 团队冲刺第一阶段第九天
  13. linux下多线程断点下载工具-axel
  14. AS常用指令,常用功能,以及常见问题
  15. 面试知识储备:新浪微博Android客户端的实现
  16. 使用python获取日历信息并制作订阅文件
  17. 计算机专业的英文简历范文带翻译,[网络工程师个人英文简历模板]英文简历范文带翻译...
  18. B数和B+树、红黑树数据结构的特点
  19. 插件 实用的窗口置顶小工具 TopMost
  20. Visual Hull基于序列图像的三维重建

热门文章

  1. java项目中使用kettle的JNDI连接配置
  2. Linux下如何查看高CPU占用率线程 专题
  3. Spring学习篇01-Spring容器相关基本概念
  4. MyEclipse2014安装aptana插件
  5. HTML 4.0 语 法 教 学
  6. ASP.NET中使用IFRAME建立类Modal窗口
  7. 系统调用的概念和类型
  8. Hibernate常用查询
  9. 超定方程组最小二乘解法——正规方程组求解(matlab代码)
  10. 多个Tomcat同时运行环境配置 - imsoft.cnblogs