正在阅读:由C++转向C#需要注意的变化(三)由C++转向C#需要注意的变化(三)

2004-11-18 15:52 出处:CSDN 作者:AustinLei 责任编辑:linjixiong


  publicstaticvoidMain()
  {
  AsynchIOTestertheApp=newAsynchIOTester();
  theApp.Run();
  }

  new关健字能够启动构造器。在构造器中我们打开一个文件,并得到一个Stream对象。然后在缓冲中分配空间并与回调机制联结起来。


  AsynchIOTester()
  {
  inputStream=File.OpenRead(@"C:\MSDN\fromCppToCS.txt");
  buffer=newbyte[BUFFER_SIZE];
  myCallBack=newAsyncCallback(this.OnCompletedRead);
  }

  在Run方法中,我们调用了BeginRead,它将以异步的方式读取文件。


  inputStream.BeginRead(
  buffer,//存放结果
  0,//偏移量
  buffer.Length,//缓冲区中有多少字节
  myCallBack,//回调代理
  null);//本地对象

  这时,我们可以完成其他的工作。


  for(longi=0;i<50000;i++)
  {
  if(i%1000==0)
  {
  Console.WriteLine("i:{0}",i);
  }
  }

  文件读取操作结束后,CLR将调用回调方法。


  voidOnCompletedRead(IAsyncResultasyncResult)
  {

  在OnCompletedRead中要做的第一件事就是通过调用Stream对象的EndRead方法找出读取了多少字节:


  intbytesRead=inputStream.EndRead(asyncResult);

  对EndRead的调用将返回读取的字节数。如果返回的数字比0大,则将缓冲区转换为一个字符串,然后将它写到控制台上,然后再次调用BeginRead,开始另一次异步读的过程。


  if(bytesRead>0)
  {
  Strings=Encoding.ASCII.GetString(buffer,0,bytesRead);
  Console.WriteLine(s);
  inputStream.BeginRead(buffer,0,buffer.Length,
  myCallBack,null);
  }

  现在,在读取文件的过程中就可以作别的工作了(在本例中是从1数到50000),但我们可以在每次缓冲区满了时对读取的数据进行处理(在本例中是向控制台输出缓冲区中的数据)。有兴趣的读者可以点击此处下载完整的源代码。

  异步I/O的管理完全是由CLR提供的,这样,在网络上读取文件时,会更好些。


察看评论详细内容 我要发表评论
作者笔名 简短内容 发表时间
:
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品