2011-11-07 82 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上過濾,其他只在活動連接上過濾。所以在某些情況下你的情況會起作用。