我使用分段http下载使用范围(HttpWebRequest.AddRanges())分割文件的部分,然后加入所有部分。如果一个文件是100字节,我将它分成4部分(0-24,25-49,50-74,75-99),并且我调用四次DownloadPart函数。 使用异步编程模型(BeginRead/EndRead)下载每个部分。当所有的部件都完成我加入他们的行列,第1部分第2部分+ + ...分段FileStream写入
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的最佳方式是什么?
请不要只问我们为你解决问题。告诉我们你是如何试图自己解决问题的,然后向我们展示结果是什么,并告诉我们为什么你觉得它不起作用。请参阅“[您尝试过什么?](http://whathaveyoutried.com/)”,以获得一篇您最近需要阅读的优秀文章。 –
@JohnSaunders我填充了“myFile”(不使用部分),并且我得到了System.IO.IOExeption(另一个线程可能导致操作系统文件句柄的位置发生意外更改) – albert
不知道为什么会发生这种情况一个单一的线程。 –