异步编程:一个异步过程调用发出后,调用者不能立刻得到结果。基于事件机制,实际处理这
个调用的部件在完成后,通过状态、通知和回调来通知调用者。
一般的编程为同步编程,程序会一直等待直到响应为止,甚至会陷入无响应状态(想必大家深有体会)
1.APM(Asynchromous Programming Model)
可在自定义的类中实现返回类型为IAsyncResult接口的BeginXXX方法和EndXXX
方法来实现
委托类型也定义了BeginInvoke和EndInvoke方法
例子:
同步方法:public override int Read(byte[]array,int offset,int count);
异步方法:public override IAsyncResult BeginRead(byte[] array,int offset, int numBytes, AsyncCallback userCallback, object stateObject);
//若不希望异步操作完成后调用任何代码,可以把userCallback参数设置为null
public override int EndRead(IAsyncResult asyncResult); //结束异步操作
异步编程模式是利用委托和线程池线程搞出来的模式,包括基于事件的异步编程和基于任务的异步编程
该模式利用一个线程池线程去执行一个操作,该线程池线程会立即将控制权返回给调用线程,此时线程池
线程在后台进行这个异步操作;异步操作完成之后,通过回调函数来获取异步操作返回的结果。此时就是利用委托的机制。
2.C# 5.0 async / await
只有当async和await关键字同时出现,该方法才被转换为异步方法处理
被async关键字标识的方法不会影响方法是同步还是异步运行并完成,而是,它使方法可被分割成多个片段,其中一些片段可能异步运行,这样这个方法可能异步完成
在await关键字出现的前面部分代码和后面部分代码都是同步执行的
await关键处的代码片段是在线程池线程上执行
使用async和await关键字实现的异步方法,此时的异步方法被分成了多个代码片段去执行的,而不是像之前的异步编程模型(APM)和EAP那样,使用线程池线程去执行一整个方法。
例:
3.HttpClient:接收HttpResponseMessages和发送HttpRequestMessages的主要类
可在HttpClient实例上配置扩展,设置默认的头部,取消未完成的请求和更多的设置
可通过一个单一的HttpClient实例,且它有自己的连接池
HttpClients不与特定的HTTP服务器绑定,可以使用相同的HttpClient实例提交任何HTTP请求
可以用HttpClient为特定的站点创建特殊的Client
HttpClient采用新的型模式处理异步请求使它更容易管理和协调更多的请求