关于.NET异步调用的初步总结
最近看了看.NET异步调用方面的资料,现择重点总结,若有纰漏敬请指正。
异步调用的实质:
异步调用通过委托将所需调用的方法置于一个新线程上运行,从而能够使一个可能需要较长时间的任务在后台执行而不影响调用方的其他行为。
异步调用的实现:
前面已经讲道,异步调用通过委托实现。委托支持同步和异步调用。在同步调用中,一个委托的实例可记录多个目标方法;在异步调用中,一个委托实例中有且只能包含一个目标方法。异步调用使用委托实例的BeginInvoke方法和EndInvoke方法分别开始调用和检索返回值,这两个方法在编译期生成。调用BeginInvoke后委托立即返回;调用EndInvoke时倘若委托方法未执行完毕,则阻塞当前线程至调用完毕。
假设有一个委托
那么,其BeginInvoke与EndInvoke的形式如下:
public int EndInvoke(ref string c,IAsyncResult asyncResult);
也就是说,BeginInvoke与EndInvoke的参数列表与当前委托签名有关,可以总结为:
public 委托返回值 EndInvoke(委托参数中ref/out部分,IAsyncResult asyncResult);
BeginInvoke返回一个IAsyncResult,其实质是实现IAsyncResult的System.Runtime.Remoting.Messaging.AsyncResult类。该对象相当于一个“凭证”,在调用EndInvoke时用于确认应等待返回的方法(猜测如此)。就像去银行,存钱时拿到一份存折(凭证),取款时依据存折(凭证)取款。
EndInvoke检索委托返回值,并返回标有ref/out的参数值。
IAsyncResult接口声明:
{
object AsyncState{get;}
WaitHandle AsyncWaitHandle{get;}
bool CompletedSynchronously{get;}
bool IsCompleted{get;}
}
等待调用结束的三种方法:
1、使用EndInvoke主动等待异步调用结束。这是最简单的一种方法,适用于非用户界面程序及一些IO操作,因为在调用EndInvoke之后当前线程被阻塞,除了等待什么都不能做。
2、使用WaitHandle等待异步调用结束。IAsyncResult中有WaitHandle成员,获取用于等待异步操作完成的WaitHandle,即调用结束信号。使用WaitHandle.WaitOne()可以阻塞当前线程至异步调用完成。这样做的好处是:在调用WaitOne之后、EndInvoke之前,可以执行其他处理。
3、主动轮询。使用IAsyncResult中有IsCompleted成员检索当前异步调用情况。该方法适用于用户界面程序,想象可在一个循环内做到既等待委托完成,又可以更新用户界面。
4、使用回调,在异步调用结束时执行一个操作。前面的BeginInvoke方法签名的最后两个参数用于回调。需要用到AsyncCallback委托:
回调方法在系统线程池中执行。BeginInvoke的最后一个参数(object asyncState)可以传递包含回调方法将要使用的信息的对象。在回调方法中调用EndInvoke可以通过取得System.Runtime.Remoting.Messaging.AsyncResult.AsyncDelegate实现。
个人认为方法1、2相差不算太大。
先写这么些,以后再补上其他的一些东西。
关于.NET异步调用的初步总结相关推荐
- java thrift异步调用_thrift异步调用 - thrift-cob_style-tnonblockingserver - ItBoth
[ thrift 在python中使用了 tornado和 twisted 来作为异步的webserive服务提供异步接口,自身并没有实现 twisted: Generate ...
- C4droid异步调用框架完成初步实现
由于C4droid目前(C4droid 5.0 with GCC 5.3)不支持std::future和std::async,所以异步调用必须手动实现.于是,使用std::thread,借助宏定义和指 ...
- springboot 多线程_SpringBoot异步调用@Async
一. 什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行. 二. 如何实现异步调用 ...
- C++多线程:package_task异步调用任何目标执行操作
文章目录 描述 函数成员及使用 总结 我们上一篇描述关于C++多线程中的异步操作相关库( async和 promise),本节将分享c++标准库中最后一个多线程异步操作库 package_task的学 ...
- springboot之异步调用@Async
引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3. ...
- 异步调用WCF的方法需要小心的地方
直接使用下面的代码,由于client对象占用的资源没有被释放,会导致内存泄露 GetSimServiceReference.GetSimServiceClient client = new GetSi ...
- 关于webservice的异步调用简单实例
于webservice的异步调用简单实例 无论在任何情况下,被调用方的代码无论是被异步调用还是同步调用的情况下,被调用方的代码都是一样的, 下面,我们就以异步调用一个webservice 为例作说明. ...
- Spring Boot 中使用@Async实现异步调用,加速任务执行!
欢迎关注方志朋的博客,回复"666"获面试宝典 什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照 ...
- Spring Boot 异步请求和异步调用
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 一.Spring Boot中异步请求的使用 1.异步请求与同步请求 ...
最新文章
- 静态方法static 的了解
- Activity Service 数据相互操作
- 实在不好意思,最近写个项目,一直没时间来灌水
- 使用PowerDesigner创建数据库表
- Hibernate的关联关系映射
- 全球及中国食品供应区块链行业运行形势及未来投资规模建议报告2021年版
- opencv yuv保存本地_OpenCV-dlib-python3实现人脸戴墨镜和含Y的抖音效果
- NYOJ82-迷宫寻宝1
- Wonder——Auggie | Education
- 记录博客第一次上热门
- Apple Watch要用上microLED显示屏了 最早明年...
- linux tab的含义,理解Linux中crontab定时器里的 21 含义 - 金牛座, 爬山虎, PHPCreeper, Workerman, Swoole, PHP爬虫引擎, PHP爬...
- js的if(!myFunction())有何用
- hdu3336 Count the string
- HCIA---华为认证初级网络工程师
- 怎么样简单的进行dwg转pdf格式
- qt准确获取本机mac和ip地址
- Java面试题梳理,工作5年内适用,先收藏着
- 电脑内存不够?磁盘、硬盘
- 大学c语言作业用什么搜题比较好,快速查找题库_什么手机软件可以把题库输入进去然后输入关键字可以查找点道题_淘题吧...
热门文章
- Vue 3.0已进入发布候选阶段!
- html右边距无法调整,**css+html为什么右侧菜单的字体大小和边距设置在失效?谁能看下*...
- java pgp加密_如何解密PGP加密文件(由两个PGP密钥加密.Key1具有公钥,私钥.Key2只有公钥)通过JAVA API...
- 交比不变性 matlab,高等几何答案
- ble l2cap 工作过程_BLE 链路层报文详解
- python中functools_(转)Python——functools
- Android设置Spinner控件的文字居中显示
- greenplum数据导入到mysql,将数据从DB2数据库传输到greenplum数据库
- php 实现一致性哈希,PHP一致性哈希实现。。
- android获取有线、wifi、3G(4G)的IP