我使用分段 http 下载,使用范围 (HttpWebRequest.AddRanges()) 将文件分成几部分,然后加入所有部分。如果一个文件是 100 字节,我将它分成 4 个部分(0-24、25-49、50-74、75-99)并调用四次 DownloadPart 函数。每个部分都使用异步编程模型(BeginRead/EndRead)下载。当所有部分都完成后,我加入他们,part1+ part2+ ...
public void DowloadPart(HttpWebResponse httpResp)
{
Stream httpStm = httpResp.GetResponseStream();
Stream fileStm = new FileStream("myFile.part1", FileMode.Append, FileAccess.Write);
byte[] buff = new byte[1024 * 16];
AsyncCallback callback = null;
callback = ar =>
{
int bytesRead = httpStm.EndRead(ar);
fileStm.Write(buff, 0, bytesRead);
if(bytesRead == 0)
return;
httpStm.BeginRead(buff, 0, buff.Length, callback, null);
};
httpStm.BeginRead(buff, 0, buff.Length, callback, null);
}
我想用直接写入文件来替换加入的部分。由于所有“DownloadPart”都在不同的线程中运行,从不同线程的不同位置同时写入 FileStream 的最佳方法是什么?