Mcad学习笔记之异步编程

(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)

让我们来看看同步异步的区别:

同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果

异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作

.NET框架基类库中有好几种类都可以提供同步和异步的方法调用。

因为同步方法调用会导致程序流程中途等待,所以采用同步方法的情况下往往会导致程序执行的延迟

相比来说,在某些条件下选择异步方法调用就可能更好一些

例如,有的时候程序需要给多个Web服务发出请求,还有远程处理信道(HTTP、TCP)和代理,这时就最好采用异步方法

.NET Framework允许异步调用任何方法,定义与需要调用的方法具有相同签名的委托

CLR将自动为该委托定义添加适当签名的BeginInvoke虚方法和EndInvoke虚方法和Invoke方法。

关于委托的这3个方法的详细说明可以参考这文章

http://www.cnblogs.com/aierong/archive/2005/05/25/162181.html

我们先来了解这2个方法和一个委托和一个接口:

(1)

BeginInvoke方法用于启动异步调用

它与您需要异步执行的方法具有相同的参数,只不过还有两个额外的参数,将 AsyncCallback 和 AsyncState(可通过 IAsyncResult 接口的

AsyncState 属性获得)作为最后两个参数,如没有可以为空.

BeginInvoke立即返回,不等待异步调用完成。

BeginInvoke返回IasyncResult,可用于监视调用进度。

结果对象IAsyncResult是从开始操作返回的,并且可用于获取有关异步开始操作是否已完成的状态。

结果对象被传递到结束操作,该操作返回调用的最终返回值。

在开始操作中可以提供可选的回调。如果提供回调,在调用结束后,将调用该回调;并且回调中的代码可以调用结束操作。

(2)

EndInvoke方法用于检索异步调用结果。

在调用BeginInvoke后可随时调用EndInvoke方法,注意:始终在异步调用完成后调用EndInvoke.

如果异步调用未完成,EndInvoke将一直阻塞到异步调用完成。

EndInvoke的参数包括需要异步执行的方法的out和ref参数以及由BeginInvoke返回的IAsyncResult。

要注意的是,始终在异步调用完成后调用EndInvoke

时间: 2024-08-03 23:18:35

Mcad学习笔记之异步编程的相关文章

跟我学习javascript解决异步编程异常方案_javascript技巧

一.JavaScript异步编程的两个核心难点 异步I/O.事件驱动使得单线程的JavaScript得以在不阻塞UI的情况下执行网络.文件访问功能,且使之在后端实现了较高的性能.然而异步风格也引来了一些麻烦,其中比较核心的问题是: 1.函数嵌套过深 JavaScript的异步调用基于回调函数,当多个异步事务多级依赖时,回调函数会形成多级的嵌套,代码变成 金字塔型结构.这不仅使得代码变难看难懂,更使得调试.重构的过程充满风险. 2.异常处理 回调嵌套不仅仅是使代码变得杂乱,也使得错误处理更复杂.这

简明Python教程学习笔记_6_面向对象编程

简介 类和对象是面向对象编程的两个主要方面.类创建一个新类型,而对象这个类的 实例 .这类似于你有一个int类型的变量,这存储整数的变量是int类的实例(对象). 类(Class)::用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 对象:          通过类定义的数据结构实例.对象包括两个数据成员(类变量和实例变量)和方法. 实例化:      创建一个类的实例,类的具体对象.方法:          类中定义的函数. (方法和函数在

Mcad学习笔记之Microsoft Windows服务

Windows服务是在后台运行的 它没有用户界面,比较适合处理不要与用户交互的任务 它可以运行在win2000,winXp,WinNt等操作系统上 关于如何编写简单windows服务应用程序 大家可以参考 http://chs.gotdotnet.com/QuickStart/howto/default.aspx?url=/quickstart/howto/doc/SimpleService.aspx 我在这里就个人的学习心得,做了一个小总结: Microsoft Windows服务使用Syst

Mcad学习笔记之序列化(2进制和Soap序列化)

我最近学习remoting和web服务时,总是看到一个重要的字眼"序列化". 那什么是序列化呢? 以前我也模模糊糊. 为了搞清楚,请和我一起来序列化学习之旅吧. 让我们先看看序列化的定义,以下是微软的说明: 序列化可被定义为将对象的状态存储到存储媒介中的过程.在此过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流.在以后反序列化该对象时,创建原始对象的精确复本 序列化一般用在2种地方: 1.将数据保持到存储中 例如:我知道在Asp.Ne

java学习笔记14--多线程编程基础1

多线程编程基础 多进程 一个独立程序的每一次运行称为一个进程,例如:用字处理软件编辑文稿时,同时打开mp3播放程序听音乐,这两个独立的程序在同时运行,称为两个进程 进程要占用相当一部分处理器时间和内存资源 进程具有独立的内存空间 通信很不方便,编程模型比较复杂   多线程 一个程序中多段代码同时并发执行,称为多线程,线程比进程开销小,协作和数据交换容易 Java是第一个支持内置线程操作的主流编程语言,多数程序设计语言支持多线程要借助于操作系统"原语(primitives)" Threa

Mcad学习笔记之委托再理解

(delegate的构造器,MulticastDelegate,BeginInvoke,EndInvoke,Invoke4个方法的探讨) 先定义一个委托如下: public delegate void myEventHandler(int i,out string o); 再用MSIL反汇编程序(Ildasm.exe)来观看反汇编代码 其实CLR为我们做了4件事情 1.定义一个构造器 2.定义一个虚方法BeginInvoke 3.定义一个虚方法EndInvoke 4.定义一个虚方法Invoke

java学习笔记15--多线程编程基础2

线程的生命周期 1.线程的生命周期 线程从产生到消亡的过程 一个线程在任何时刻都处于某种线程状态(thread state)  线程生命周期状态图 诞生状态 线程刚刚被创建 就绪状态 线程的 start 方法已被执行 线程已准备好运行 运行状态 处理机分配给了线程,线程正在运行 阻塞状态(Blocked) 在线程发出输入/输出请求且必须等待其返回 遇到用synchronized标记的方法而未获得其监视器暂时不能进入执行时 休眠状态(Sleeping) 执行sleep方法而进入休眠 死亡状态 线程

php学习笔记之面向对象编程_php技巧

复制代码 代码如下: <?phpclass db {     private $mysqli; //数据库连接     private $options; //SQL选项     private $tableName; //表名     public function __construct($tabName) {         $this->tableName = $tabName;         $this->db ();     }     private function d

php学习笔记之面向对象编程

 代码如下 复制代码 class db {     private $mysqli; //数据库连接     private $options; //SQL选项     private $tableName; //表名     public function __construct($tabName) {         $this->tableName = $tabName;         $this->db ();     }     private function db() {