我想用C#中的多線程下載單個文件。 例如: 線程1開始從1%下載到40%。 線程2開始從41%下載到70%。 Thread3開始從71%下載到100%如何使用C#中的多線程下載單個文件
請給我一些代碼。在此先感謝
我想用C#中的多線程下載單個文件。 例如: 線程1開始從1%下載到40%。 線程2開始從41%下載到70%。 Thread3開始從71%下載到100%如何使用C#中的多線程下載單個文件
請給我一些代碼。在此先感謝
如何寫一個新的文件有關使用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可能會把所有東西都轉移到相同的連接。
您可以通過使用Range HTTP header。下載每個部分,以一個單獨的文件,並把它們合併完成後(以避免多線程問題)
更新
最簡單的方法就是使用每線程HttpWebRequest
。在這裏閱讀答案:HttpWebRequest or WebRequest - Resume Download ASP.NET
要合併的文件,只需按順序閱讀並(使用FileStream
類)
謝謝,這很有趣。 –
閱讀我的更新。 – jgauffin
AddRange
允許您下載範圍。這將設置範圍HTTP標頭字段,告訴服務器您只對某個範圍感興趣。允許多個範圍。
有人提到這種方法沒有用,只會增加開銷。 Imho這取決於情況,它們是僅在每個連接速度下播種的服務器。有些會在IP上過濾,其他只在活動連接上過濾。所以在某些情況下你的情況會起作用。
您的網絡連接是否完全使用?如果是這樣,你不能加速與多個線程的下載。 –
這沒有幫助。這隻會增加開銷。 –
爲什麼認爲客戶端/帶寬是問題所在?如果Web服務器使用某種不檢查多個連接是否來自同一個客戶端的限制,它可以提供幫助。 – jgauffin