请教高手——如何两次调用异步方法?
我写一个加密程序。将一个文件加密写到另一个文件中。其中要两次写入流。
byte[] data-〉CryptoStream cs;
data[] data->FileStream fs;
如果第一步是同步,第二步是异步。就没有问题,但是内存消耗太大,我想两次都用异步
。
这该如何控制呢?
代码如下:其中文件是否写完的条件是写入和读取的计数器相同。
public class CryStateObject
{
public byte[] buffer;
public MemoryStream ms;//内存流
public CryptoStream cs;//加密流
}
public void EncryptFile(string filename)
{
bProccessFile=true;
originFile=new FileStream("a.dat",FileMode.Open);//源文件
processFile=new FileStream("b.dat",FileMode.Create);//要加密的文件
CryStateObject cobject=new CryStateObject();
cobject.ms=new MemoryStream();
cobject.buffer=new byte[buffersize];
byte[] byteTemp=new byte[Convert.ToInt32(buffersize*0.8)];
this.proceed=0;//已处理的长度
int datalen=0;//一次读入的长度
recvCallCount=recvCallbackCount=0;
while(this.proceed<originFile.Length)
{
recvCallCount++;
datalen=originFile.Read(byteTemp,0,byteTemp.Length);
this.proceed+=datalen;
cobject.ms=new MemoryStream();
transform = symm.CreateEncryptor(symm.Key,symm.IV);
cobject.cs = new CryptoStream(cobject.ms, transform, CryptoStr
eamMode.Write);
cobject.cs.Write(byteTemp, 0, datalen);
cobject.cs.FlushFinalBlock();
byte[] data=cobject.ms.ToArray();
string strLen=data.Length.ToString();//记录每次加密的字节数,解
密时同样处理
byte[] byteLen=Encoding.ASCII.GetBytes(strLen+"\x10");
processFile.Write(byteLen,0,byteLen.Length);
processFile.BeginWrite(data,0,data.Length,new AsyncCallback(En
cryptFileWriteBack),processFile);
}
}
private void EncryptFileWriteBack(IAsyncResult iar)
{
lock(this)
{
recvCallbackCount++;
FileStream file=(FileStream)iar.AsyncState;
file.EndWrite(iar);
RaiseWriteEncryptFileEvent(originFile.Length.ToString(),(doubl
e)this.proceed);
if(recvCallbackCount==recvCallCount)//加密结束
{
this.originFile.Close();
this.processFile.Close();
}
}
}