分析你的程序,可以这么说,你不理解异步读,
IAsyncResult result=file.BeginRead(byteArray,0,byteArray.Length,null,null);
你这么写就等于
file.Read(byteArray,0,byteArray.Length);
等于同步读,
实际上,result.IsCompleted 永远不会有 false所以你要改
例子如下:private byte [] byteArray=new byte[1000];
private char [] charArray=new char[1000];
private FileStream file;public void AsynRead(string fileName)
{
   try
     {
file=new FileStream(fileName,FileMode.Open);
file.BeginRead(byteArray,0,byteArray.Length,new AsyncCallback(this.FileFinRead),null);
     }
   catch(Exception e)
   {
Console.WriteLine("exception occurs:({0}){1}",DateTime.Now.ToString("yyyy-MM-dd"),e.Message);
   }
}//回掉函数
private void FileFinRead(IAsyncResult As)
{
   int BytesRead = file.EndRead(As);
   if(BytesRead > 0)
   {
      Array.Clear(byteArray,0,byteArray.Length);
      Console.WriteLine("reading file...");
      file.BeginRead(byteArray,0,byteArray.Length,new AsyncCallback(this.FileFinRead),null);      
   }
   else
   {
       Decoder d = Encoding.ASCII.GetDecoder();
       d.GetChars(byteArray,0,byteArray.Length,charArray,0);
       Console.WriteLine(charArray);
   }
}

解决方案 »

  1.   

    呵呵`~
    我现在真的很迷惘
    我试过在BeginRead()加上:
    for(int i=0;i<100;i++)
    {
      Console.WriteLine("AsynReading....");
    }
    但是它是等全部文件都读完了才执行这句,异步读不是不用等IO完成就可以执行下面的句子的吗?
    还有两个问题:回调函是什么时候被调用的?
    "实际上,result.IsCompleted 永远不会有 false"那么这个属性有什么用?
      

  2.   

    异步通讯可以这样解释,一个线程t1,如果在t1的第n句开始异步读取就是等于在n句另启动了一个线程t2,而t1将继续进程,当异步读取结束的时候,t2进程将执行你所定义的 回调函数,从新跳回到t1进程之中,现在你明白了吗?所以无论在你t1之中放入什么代码,你都不可能得到t2的情况,因为
    IAsyncResult result=file.BeginRead(byteArray,0,byteArray.Length,null,null);
    中的result只是一个结果一个语句的结果。这个语句必须完成之后才能显示出来。