如何在C#中使用多线程下载单个文件

时间:2011-11-07 12:11:44

标签: c# multithreading

我想在C#中使用Multi-Threads下载单个文件。 例如: Thread1开始从1%下载到40%。 Thread2开始从41%下载到70%。 Thread3开始从71%下载到100%

请给我一些代码。提前致谢

3 个答案:

答案 0 :(得分:4)

您可以使用Range HTTP header来完成此操作。将每个部分下载到单独的文件并在完成后合并它们(以避免多线程问题)

<强>更新

最简单的方法是每个线程使用一个HttpWebRequest。在这里阅读答案:HttpWebRequest or WebRequest - Resume Download ASP.NET

要合并文件,只需按顺序读取它们并写入新文件(使用FileStream类)

答案 1 :(得分:4)

如何使用HttpRequest类,调用AddRange方法。这应该是一个带有偏移量的标题,可以从中开始下载。

    var request = HttpWebRequest.Create(new Uri("http://www.myurl.com/hugefile"));

    request.Method = "GET";
    request.AddRange(offset_for_this_thread);  // I assume you have calculated this
                                               // before firing threads
    Stream reponseStream = request.GetResponse().GetResponseStream();

然后,您可以从'responseseream'中读取数据,并在完成后将其与其他线程合并。

然而,正如其他人所注意到的,如果你有两个适配器,都连接到互联网,并且你在那些适配器之间有某种带宽平衡,这只会带来价值...否则Windows可能会将所有内容转移到同一个连接。

答案 2 :(得分:2)

AddRange允许您仅下载范围。这将设置范围HTTP标头字段,它将告诉服务器您只对某个范围感兴趣。允许多个范围。

有些人提到这种方法没用,只会增加开销。 Imho这取决于具体情况,它们是服务器,每个连接仅以速度X播种。有些将过滤IP,另一些仅在活动连接上过滤。所以在某些情况下你的场景会起作用。