异步回调和同步回调

来源:互联网 发布:宁波新房成交最新数据 编辑:程序博客网 时间:2024/05/19 11:50
异步回调就是发起请求后,不等待响应就先去处理自己的响应,它不是处理整个请求,只是处理一小部分,在Web页上就表现为页面没刷新,却局部更新了数据。相对于同步就是必须等到响应该请求后才能做别的事,具体到Web页就是整个页面刷新了,数据才更新。下面举两个列子:首先举个同步调用的例子:比如你的程序调用了一个方法,这个方法要执行很长很长时间,而且这个时间都不确定,传统的办法就是“同步调用”,如下:private int Func(){// 这个方法要执行很长时间,并且返回一个int的值。}private void A(){int n = Func();textBox1.Text = n.ToString();// 这里得到的n就是Func执行出来的结果,并且显示在textBox1中。}采用上述方法,可以叫做同步调用,很明显它有一个缺点:Func方法执行的时间过长,程序会阻塞,并且无法继续执行其他的代码,给用户的体验就是整个程序都会僵着,打开任务管理器会提示该程序没有响应,用户以为程序死了,就会手动结束这个程序,而异步调用就不一样,在调用完Func这个方法后,不必等待Func执行完,就可以执行其他的代码,直到Func执行完,才把结果返回,如果Func提供了异步方法FuncAsync(),就可以这样调用:private void A(){FuncAsync();// 这里执行FuncAsync方法,并不会阻塞,程序会在后台执行完FuncAsync方法后,自动调用FuncCompleted方法,并且把结果传过去。}private void FuncCompleted(int n){textBox1.Text = n.ToString();// 参数n就是异步回调返回的结果,}异步回调需要编写代码才能支持,网络传输方面的类库一般都提供异步方法,如socket编程,web服务,ajax,wcf等,有些异步是同一个线程完成的,有些异步是不同的线程,所以回调函数里要更新控件都会提示跨线程访问控件的错误提示。 


软件模块中存在一定接口,从调用方式上分为三类

1、同步调用;2、回调;3、异步调用

首先,同步调用是一种阻塞式调用,调用方要等待对象执行完毕才返回。它是一种单向调用。

其次,回调是一种双向调用模式,也就是说,被调用方在接口被调用得同时会调用对方得接口。

最后,异步调用是一种类似消息或者事件的机制,不过它的调用方向刚好相反,接口的服务在收到被调用的信息或事件时,会主动调用(调用方)的接口。

回调和异步调用得关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。

对于不同类型的语言(结构化语言和对象语言)、平台(win32,jdk)等,客户和服务的交互除了同步方式以外,都需要具备一定的异步通知机制,让服务方或接口提供方,在某些情况下能主动通知客户,而回调是实现异步的一个最简捷的途径。

结构化语言中,可以通过回调函数还实现回调,回调函数也是一个函数或过程,不过它是一个由调用方自己实现,供被调用方使用的特殊函数。

在面向对象语言中,回调则是通过接口或抽象类来实现的,我们把实现这种接口的类称为回调类,回调类的对象称为回调对象。对于象C++或objectPascal这些兼容了过程特性的对象语言,不仅提供了回调对象、回调方法等特性,也行兼容过程语言的回调函数机制。

0 0