异步回调方式的讨论

很多时候需要异步操作来避免阻塞当前线程,而异步操作的结果需要通过回调告知调用者,而回调的方式有多种,且不同语言支持的情况也不一样。

回调机制是在某个时间发生前准备好的一段代码,事件一旦发生,系就会执行相应的代码。因此回调有两个主要部分组成:(1)注册过程 (2)事件发生时需要执行的代码。

实现回调机制的途径有一下几大类:

1.注册对象和回调方法

   (1)目标-动作对:异步调用时,简单保存目标对象指针和其回调处理方法的指针,当异步操作结束后,被调用对象会通过二者找到回调的入口,并执行回调。

   (2) 委托机制:只需要保存目标对象的指针,而目标对象肯定实现了回调协议,即其回调处理方法是唯一的,明确的,因此仅通过目标对象,就能找到回调接口。当某个对象收到多个事件并要求同一个对象来处理所有的事件时,就可以使用委托机制了。

(3)通告机制:类似于设计模式中的观察者模式(订阅者-发布者模式),多个监听对象中,每个对象都有一个回调入口(目标-动作对),他们监听的同一个异步事件,当异步完成时,它们会被一一回调。当需要多个对象(或者两个无关的对象)处理同一事件时,可以使用通告机制。

2.继承回调类

  我们可以创建类A继承一个回调类(接口),并实现指定的回调方法,那么类A的对象就可以作为回调对象,这样在异步调用的时候不用注册对象和方法,而是直接传入一个回调对象即可。这种方式虽然在注册过程中方便,但是在准备回调代码时麻烦,因为不同类型的回调都要创建一个新类,导致代码膨胀。

3.注册时实现回调

此方式只是在使用回调的方式与其他几种不同,即允许你在调用异步接口的同时编写回调处理代码,即整合了回调的注册过程和准备回调代码的过程。这种方式适合处理简单快速的回调任务,帮助开发者写出短小精炼的代码。已知Object-C中的Block机制和Java中回调机制支持此方式。

时间: 2024-10-08 23:31:28

异步回调方式的讨论的相关文章

State Threads——异步回调的线性实现

State Threads——异步回调的线性实现 原文链接:http://coolshell.cn/articles/12012.html 本文的标题看起来有点拗口,其实State Threads库就是在单线程中使用同步编程思想来实现异步的处理流程,从而实现单线程能并发处理成百上千个请求,而且每个请求的处理过程是线性的,没有使用晦涩难懂的callback机制来衔接处理流程. ST (State Threads) 库提供了一种高性能.可扩展服务器(比如web server.proxy server

.net 非阻塞事件获取返回异步回调结果

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace AsyncCallBack_Delegate { class Program { static void Main(string[] args) { JobManager manager = new JobManager(); ReadJob read = m

C++ 异步回调

上一文中讲了C语言通过函数指针实现异步回调 本文继续讨论C++中实现回调,由于C++中有类,而C语言中的回调函数不能直接定义为成员函数,所以就很麻烦了,下面将讨论解决办法. 首先知道静态成员函数是全局的,也就是类的,因此推测可以用静态成员函数来实现回调机制.这里补充一下关于类中静态成员的知识 #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; class xiab

Code-C#-Delegate:委托(delegate)的三种调用方式:同步调用,异步调用,异步回调

ylbtech-Code-C#-Delegate:委托(delegate)的三种调用方式:同步调用,异步调用,异步回调 1.返回顶部 1. 下面为即将被调用的方法: public delegate int AddHandler(int a, int b); public class 加法类 { public static int Add(int a, int b) { Console.WriteLine("开始计算:" + a + "+" + b); Thread.

python第三十七天,GIL全局解释器锁*****,线程池与进程池 同步异步,阻塞与非阻塞,异步回调

GIL全局解释器锁 1.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe

jquery.Deferred promise解决异步回调

我们先来看一下编写AJAX编码经常遇到的几个问题: 1.由于AJAX是异步的,所有依赖AJAX返回结果的代码必需写在AJAX回调函数中.这就不可避免地形成了嵌套,ajax等异步操作越多,嵌套层次就会越深,代码可读性就会越差. $.ajax({ url: url, data: dataObject, success: function(){ console.log("I depend on ajax result."); }, error: function(){} }); consol

如何优雅的处理Nodejs中的异步回调

前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用.在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O的操作结果基本上都需要在回调函数中处理,比如下面的这个读取文件内容的函数: fs.readFile('/etc/passwd', function (err, data) { if (err) throw err; console.log(data); }); 那,我们读取两个文件,将这两个文件的内

异步回调/我们为什么要使用NodeJS

1.原文转载自:http://limu.iteye.com/blog/1013223 原文转载自:http://blog.csdn.net/zhangliangzi/article/details/52066560 2.说到"调用",模块之间总是存在这一定的接口,模块之间通过这些接口调用以通信联系,从调用方式上看,可以分为三类:同步调用.回调和异步调用. 同步调用是一种阻塞式调用,也是我们在写程序中经常使用的: 回调是一种双向的调用模式: 异步调用是一种类似消息或事件的机制,解决了同步

NSURLConnection的异步请求方式

iOS5.0 SDK NSURLConnection类新增的sendAsynchronousRequest:queue:completionHandler:方法 sendAsynchronousRequest可以很容易地使用NSURLRequest接收回调,完成http通信. 1. post数据 1 - (void)httpAsynchronousRequest{ 2 3 NSURL *url = [NSURL URLWithString:@"http://url"]; 4 5 NSS