APM就是异步编程模型的缩写
APm最具代表性的特点就是:一个异步功能由以Begin开头,end开头的两个方法
Begin开头的方法表示启动异步功能的执行,end表示结束并且返回执行结果
。异步编写模型是一种模式,该模式允许用更少的线程去做更多的操作,
.NET Framework很多类也实现了该模式,同时我们也可以自定义类来实现该模式,
(也就是在自定义的类中实现返回类型为IAsyncResult接口的BeginXXX方法和EndXXX方法),
另外委托类型也定义了BeginInvoke和EndInvoke方法,并且我们使用WSDL.exe和SvcUtil.exe
工具来生成Web服务的代理类型时,也会生成使用了APM的BeginXxx和EndXxx方法。
FileStream类
// 开始异步读操作
// 前面的3个参数和同步方法代表的意思一样,这里就不说了,可以看到这里多出了2个参数
// userCallback代表当异步IO操作完成时,你希望由一个线程池线程执行的方法,该方法必须匹配AsyncCallback委托
// stateObject代表你希望转发给回调方法的一个对象的引用,在回调方法中,可以查询IAsyncResult接口的AsyncState属性来访问该对象
public override IAsyncResult BeginRead(byte[] array, int offset, int numBytes, AsyncCallback userCallback, Object stateObject
)
如果你在使用该异步方法时,不希望异步操作完成后调用任何代码,你可以把userCallback参数设置为null
FileStream的EndRead方法返回一个Int32来代表从文件流中实际读取的字节数。
对于访问异步操作的结果,APM提供了四种方式供开发人员选择:
在调用BeginXxx方法的线程上调用EndXxx方法来得到异步操作的结果,但是这种方式会阻塞调用线程,知道操作完成之后调用线程才继续运行
查询IAsyncResult的AsyncWaitHandle属性,从而得到WaitHandle,然后再调用它的WaitOne方法来使一个线程阻塞并等待操作完成再调用EndXxx方法来获得操作的结果。
循环查询IAsyncResult的IsComplete属性,操作完成后再调用EndXxx方法来获得操作返回的结果。
使用 AsyncCallback委托来指定操作完成时要调用的方法,在操作完成后调用的方法中调用EndXxx操作来获得异步操作的结果。
在上面的4种方式中,第4种方式是APM的首选方式,因为此时不会阻塞执行BeginXxx方法的线程,然而其他三种都会阻塞调用线程,相当于效果和使用同步方法是一样,个人感觉根本失去了异步编程的特点,所以其他三种方式可以简单了解下,在实际异步编程中都是使用委托的方式。
APm最具代表性的特点就是:一个异步功能由以Begin开头,end开头的两个方法
Begin开头的方法表示启动异步功能的执行,end表示结束并且返回执行结果
。异步编写模型是一种模式,该模式允许用更少的线程去做更多的操作,
.NET Framework很多类也实现了该模式,同时我们也可以自定义类来实现该模式,
(也就是在自定义的类中实现返回类型为IAsyncResult接口的BeginXXX方法和EndXXX方法),
另外委托类型也定义了BeginInvoke和EndInvoke方法,并且我们使用WSDL.exe和SvcUtil.exe
工具来生成Web服务的代理类型时,也会生成使用了APM的BeginXxx和EndXxx方法。
FileStream类
// 开始异步读操作
// 前面的3个参数和同步方法代表的意思一样,这里就不说了,可以看到这里多出了2个参数
// userCallback代表当异步IO操作完成时,你希望由一个线程池线程执行的方法,该方法必须匹配AsyncCallback委托
// stateObject代表你希望转发给回调方法的一个对象的引用,在回调方法中,可以查询IAsyncResult接口的AsyncState属性来访问该对象
public override IAsyncResult BeginRead(byte[] array, int offset, int numBytes, AsyncCallback userCallback, Object stateObject
)
如果你在使用该异步方法时,不希望异步操作完成后调用任何代码,你可以把userCallback参数设置为null
FileStream的EndRead方法返回一个Int32来代表从文件流中实际读取的字节数。
对于访问异步操作的结果,APM提供了四种方式供开发人员选择:
在调用BeginXxx方法的线程上调用EndXxx方法来得到异步操作的结果,但是这种方式会阻塞调用线程,知道操作完成之后调用线程才继续运行
查询IAsyncResult的AsyncWaitHandle属性,从而得到WaitHandle,然后再调用它的WaitOne方法来使一个线程阻塞并等待操作完成再调用EndXxx方法来获得操作的结果。
循环查询IAsyncResult的IsComplete属性,操作完成后再调用EndXxx方法来获得操作返回的结果。
使用 AsyncCallback委托来指定操作完成时要调用的方法,在操作完成后调用的方法中调用EndXxx操作来获得异步操作的结果。
在上面的4种方式中,第4种方式是APM的首选方式,因为此时不会阻塞执行BeginXxx方法的线程,然而其他三种都会阻塞调用线程,相当于效果和使用同步方法是一样,个人感觉根本失去了异步编程的特点,所以其他三种方式可以简单了解下,在实际异步编程中都是使用委托的方式。


