请教高手——如何两次调用异步方法?

broadury 2004-08-04 06:47:08
我写一个加密程序。将一个文件加密写到另一个文件中。其中要两次写入流。
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();
}
}
}
...全文
254 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lookie 2005-01-22
  • 打赏
  • 举报
回复
对,我也同意
Korny 2004-11-11
  • 打赏
  • 举报
回复
最好也在忙于这个,关于如何判断异步结束,你这里应该再加一个读出文件的写入文件的当前postion是否相等的条件
syspring 2004-11-05
  • 打赏
  • 举报
回复
up一下,顺便问个问题:

to:btut2004(《电子产品世界》程序员,申请做C#,Asp.net版主)
如果能回答出我两个问题,我一定支持你做C#,Asp.net版主 ^_^
^
1.用C#做了一个发邮件的程序,现要增加像outlook里的 回执 功能,请问怎样写?
2.异步调用时,怎样知道所有的调用都已经结束,请详细说明。
张海霖 2004-11-03
  • 打赏
  • 举报
回复
现在没时间

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧