惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Vulnerabilities – Threatpost
GbyAI
GbyAI
P
Proofpoint News Feed
L
LINUX DO - 热门话题
P
Palo Alto Networks Blog
A
About on SuperTechFans
T
Tenable Blog
M
MIT News - Artificial intelligence
IT之家
IT之家
I
Intezer
D
DataBreaches.Net
爱范儿
爱范儿
T
Threatpost
C
CERT Recently Published Vulnerability Notes
云风的 BLOG
云风的 BLOG
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
K
Kaspersky official blog
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
Y
Y Combinator Blog
Cyberwarzone
Cyberwarzone
酷 壳 – CoolShell
酷 壳 – CoolShell
D
Darknet – Hacking Tools, Hacker News & Cyber Security
H
Help Net Security
Microsoft Security Blog
Microsoft Security Blog
Spread Privacy
Spread Privacy
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
AWS News Blog
AWS News Blog
博客园 - 聂微东
C
Check Point Blog
S
Securelist
有赞技术团队
有赞技术团队
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
Last Week in AI
Last Week in AI
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
D
Docker
G
GRAHAM CLULEY
T
The Exploit Database - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tailwind CSS Blog
L
Lohrmann on Cybersecurity
G
Google Developers Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LangChain Blog

博客园 - zguosir

[转载]转给自己的,跨业洗牌 [转载]挖一口属于自己的井 MSIL探索-IL介绍 MSIL探索-序 DotNet中异步编程(APM)的研究3-代理与异步编程 我的简历 我的技术特长 我的项目-物业收费 我的项目-人员定位 我的项目-证券分析 我的项目-工作票管理 我的项目-地衡读数 我的项目-物业管理(大厦版) 我的项目-财务系统 我的项目-图形拼接 我的项目-磁盘考试系统 我的项目-通用题库系统 收藏列表 DotNet中异步编程(APM)的研究2-三种聚集方式rendevousing
DotNet中异步编程(APM)的研究1-异步编程介绍
zguosir · 2007-08-31 · via 博客园 - zguosir

异步编程介绍(by zguosir/gshzheng)

异步操作典型应用于要完成一项耗时或者涉及I/O的任务时,如,复杂计算,打开大型文件,连接远程计算机,进行数据库查询等等。异步操作在与程序主线程不同的线程中执行,当应用程序异步地执行操作时,主线程并不被挂起,而是可以继续的向下执行。

.Net类库中(Framework Class LibraryFCL),有许多类支持异步操作,如下表,

Area

Class Name

Method Name

I/O

Sysetm.IO.Stream

BeginRead()

BeginWrite()

Dns

System.Net.Dns

BeginrResolve()

BeginGetHostAddress()

Socket

System.Net.Sockets

.Socket

BeginAccept()

BeginReceive()

BeginSend()

Web

System.Net.WebRequest

BeginGetRequestStream()

BeginGetResponse()

Sql

System..Data.SqlClient

.SqlCommand

BeginExecuteNonQuery()

BeginExecuteReader()

Delegate

System.MulticastDelegate

BeginInvoke()

异步操作要提供两个对应的方法名BeginOperation()EndOperation(),通过这两个方法来分别来开启和结束一个异步操作Operation。如FileStream类提供BeginRead()EndRead()方法,异步地从文件种读取一定的字节数。一般的,异步方法都会有与之对应的同步操作,如Read()为文件读取的同步方法。

当调用异步方法BeginOperation(),应用程序可以继续在调用线程(主线程)上执行接下来的指令,而异步操作将在另外的线程上执行。对每一次的调用BeginOperation(),程序需要在某处相应的调用EndOperation()以得到操作的返回结果。

调用异步方法BeginOperation()后,该方法返回一个实现了IAsyncResult接口的对象。这个对象保存了关于此异步操作执行的一些信息,它可以代表这次异步操作。IAsyncResult对象就像.Net CLR开给应用程序的收据,表示接收了此次异步操作的请求,并尝试开始执行。异步操作可能很快完成,可能需一段时间后完成,也可能永远也完成不了。

IAsyncResultAPM编程的核心,它提供四个只读属性,在异步操作启动后,应用程序可以查询这些属性,以确定操作是否完成。下表显示了IAsyncResult接口的属性,

Property

Description

AsyncState

获取开启异步操作时传入的状态对象,一般用于方法回调方式

IsCompleted

获取操作是否完成的标志,一般用于轮巡方式

AsyncWaitHandler

获取用于等待操作完成的WaitHandle,一般用于等待直到完成方式

CompletedSynchronously

获取异步操作是否同步完成的指示。

异步方法BeginOpertion()方法拥有与对应的同步方法一致的参数(无论是传值还是传引用),另外,所有的BeginOpertion()方法参数列表最后都会包含两个附加的参数,第一个为AsyncCallBack代理类型对象,当异步操作完毕后将自动调用由它代表的方法;第二个附加的参数为用户自定义的状态对象,它将存储在返回的IAsyncResult对象的AsyncState属性中。

如果操作结束后不需要调用某个回调函数,或者不需要传入一个自定义的状态对象,在实际函数调用中,这两个最后的参数都可以为null

调用EndOperation()关闭异步操作执行。此时必须传入由BeginOperaton()返回的IAsyncResult对象,才正式关闭此异步操作,以及释放和回收异步操作所用的资源。EndOperation()的返回值相当于直接调用同步方法的返回值,如EndRead()方法返回从FileStream中实际读到的字节数。

如果在一个由IAsyncResult表示的异步操作还没有完成之前,调用EndOperation(),则将挂起当前线程,直到异步操作完成。异步操作中引起的异常,将由EndOperation()方法抛出来。对同一个IAsyncResult异步操作,调用多次EndOperation()方法,将引起不可预知的后果。同样,调用EndOperation(),传入的不是由同一个异步操作BeginOperation()返回的IAsyncResult对象,其后果也不可预知。