2

範囲 (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 に同時に書き込む最良の方法は何ですか?

4

1 に答える 1