分析你的程序,可以这么说,你不理解异步读,
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);
}
}
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);
}
}
我现在真的很迷惘
我试过在BeginRead()加上:
for(int i=0;i<100;i++)
{
Console.WriteLine("AsynReading....");
}
但是它是等全部文件都读完了才执行这句,异步读不是不用等IO完成就可以执行下面的句子的吗?
还有两个问题:回调函是什么时候被调用的?
"实际上,result.IsCompleted 永远不会有 false"那么这个属性有什么用?
IAsyncResult result=file.BeginRead(byteArray,0,byteArray.Length,null,null);
中的result只是一个结果一个语句的结果。这个语句必须完成之后才能显示出来。