异步IO
异步读写机制对于比较耗时的文件读写操作,例如大型的文件或者从网路下载的的数据甚至读取慢速的存储设备都特别有用。与异步IO相比,同步IO在应用程序必须完成一个处理才能开始进行下一个处理;而异步IO在读或写一个文件的时候,同时能够执行其他的操作,异步IO一般由方法BeginRead()和方法BeginWrite()支持。异步IO一般包括以下步骤:
- 自定义一个无返回值的方法,这个方法的签名需要和委托AsynCallBabk的签名一致。(无返回值,把IAsyncResult接口的引用作为参数。)
- 创建一个AsynCallBabk委托,将1步创建的方法作为参数。
- 使用BeginRead()方法读取文件。
- 使用方法EndRead()方法获得所读取的字节数组。
比如:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO;
namespace ConsoleApplication1 { class AsynchronousIO { FileStream fs; double longNum = 100000000; static void Main(string[] args) { AsynchronousIO asy = new AsynchronousIO(); asy.LongWrite(); Console.Read(); } public void LongWrite() { byte[] bt = new byte[100000000]; for (int i = 0; i < longNum; i++) { bt[i] = (byte)i; } Console.WriteLine("数据正在写入...."); AsyncCallback myCallback = End;//当异步操作完成时调用End方法。 fs = new FileStream("d://text.txt", FileMode.OpenOrCreate); fs.BeginWrite(bt, 0, bt.Length - 1, myCallback, null);//调用异步操作,程序继续向下执行(不会等待) Console.WriteLine("正在将文件写入数据.....");
} public void End(IAsyncResult asyncResult) { fs.Close(); Console.WriteLine("写入完毕"); } } }
|
在以上程序当中,我们将大容量数据写入文件,并采用异步写入的方式。在调用到BeginWrite()方法的时候开始写入文件,但程序并不会等待文件的写入完成,而是继续向下执行,执行代码Console.WriteLine("正在将文件写入数据.....");,但文件写入完成后将执行委托myCallback 所指向的End()方法。这便是异步执行的好处了。