我想在C#中使用Multi-Threads下载单个文件。 例如: Thread1开始从1%下载到40%。 Thread2开始从41%下载到70%。 Thread3开始从71%下载到100%
请给我一些代码。提前致谢
答案 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,另一些仅在活动连接上过滤。所以在某些情况下你的场景会起作用。