C# 使用APM执行受I/O限制的异步操作(转)

来源:互联网 发布:淘宝新店刷单技巧 编辑:程序博客网 时间:2024/05/08 19:37

为了从FileStream对象中同步地读取字节,我们可以调用它的Read方法,该方法的原型如下所示:

Public Int32 Read(Byte[] array , Int32 offset , Int32 count)

为了从文件中异步地读取字节,可以调用FileStream的BeginRead方法:

IAsyncResult   BeginRead(Byte[] array, Int32 offset , Int32 numBytes , AsyncCallback userCallback , Object stateObject)

调用BeginRead方法时,我们在请求Windows将从文件中读取的字节填充到字节数组中。因为要执行I/O操作,所以BeginRead方法实际上将操作请求加入到Windows设备驱动程序的队列中,而Windows的设备驱动程序知道如何与正确的硬件设备通信。就这样,硬件接管了该操作,也就不需要任何线程来执行任何操作,甚至还不需要等待输出结果------ 这种方法相当高效!

BeginRead方法返回一个其类型实现了System。IAsyncResult接口的对象的引用。调用BeginRead方法时,它构建一个对象来惟一地标识I/O操作请求,并将请求加入Windows设备驱动程序的队列,然后将IAsyncResult对象返回给我们。我们可以将IAsyncResult对象看作收据。当BeginRead方法返回时,I/O操作只是被排队,它还没有完成。因此,我们还不能操作字节数组中的字节,因为数组中还有没有包含所请求的数据。

      实际上,数组中可能已经包含了所请求的数据,因为I/O操作已经被异步地执行了,因此,在BeginRead方法返回时,数据可能已经被读取了。但是数据也有可能在几秒钟之后从服务器读取过来,因外,还有可能到服务器的网络连接已经瘫痪,数据永远也不会被读取过来。因为所有上西游记情误解都有可能发生,所以我们需要一种方法来发现实际上发生了哪一种情况,而且还要知道结果是什么时候检测到的,我们将这种情况称为异步操作结果的聚集(rendezvousing)。

原创粉丝点击