2011-11-07 58 views
5

我想用C#中的多线程下载单个文件。 例如: 线程1开始从1%下载到40%。 线程2开始从41%下载到70%。 Thread3开始从71%下载到100%如何使用C#中的多线程下载单个文件

请给我一些代码。在此先感谢

+2

您的网络连接是否完全使用?如果是这样,你不能加速与多个线程的下载。 –

+3

这没有帮助。这只会增加开销。 –

+0

为什么认为客户端/带宽是问题所在?如果Web服务器使用某种不检查多个连接是否来自同一个客户端的限制,它可以提供帮助。 – jgauffin

回答

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(); 

然后,您可以从'responseStream'读取数据,一旦它完成与其他线程合并。然而,正如其他人所注意到的,如果你有两个适配器,它们都连接到互联网,并且你在这些适配器之间有某种带宽平衡,这将只会带来价值......否则,Windows可能会把所有东西都转移到相同的连接。

4

您可以通过使用Range HTTP header。下载每个部分,以一个单独的文件,并把它们合并完成后(以避免多线程问题)

更新

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

要合并的文件,只需按顺序阅读并(使用FileStream类)

+0

谢谢,这很有趣。 –

+0

阅读我的更新。 – jgauffin

2

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

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