範囲 (HttpWebRequest.AddRanges()) を使用してセグメント化された http ダウンロードを使用して、ファイルを部分に分割し、すべての部分を結合します。ファイルが 100 バイトの場合、4 つの部分 (0-24、25-49、50-74、75-99) に分割し、DownloadPart 関数を 4 回呼び出します。各パーツは、非同期プログラミング モデル (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 に同時に書き込む最良の方法は何ですか?