2011-11-07 3 views
5

C#でマルチスレッドで1つのファイルをダウンロードしたい。 例: スレッド1は1%から40%にダウンロードを開始します。 スレッド2は41%から70%にダウンロードを開始します。 スレッド3を71%から100%にダウンロードC#でマルチスレッドで1つのファイルをダウンロードする方法

私にいくつかのコードを提案してください。事前に感謝

+2

ネットワーク接続は完全に使用されていますか?もしそうなら、複数のスレッドでダウンロードを高速化することはできません。 –

+3

これは役に立ちません。これにより、オーバーヘッドだけが追加されます。 –

+0

なぜそれが問題となるクライアント側/帯域幅であると仮定しますか? Webサーバーが、複数の接続が同じクライアントからのものかどうかをチェックしない何らかの種類のスロットルを使用する場合に役立ちます。 – jgauffin

答えて

4

どのように呼ばれるAddRangeメソッドで、のHttpRequestクラスの使用について。これは、ダウンロードを開始するオフセットのあるヘッダでなければなりません。

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

データを「応答ストリーム」から読み取って、データが完了したら他のスレッドとマージすることができます。

しかし、これはあなたがインターネットに接続された2つのアダプタを持っていて、それらのアダプタの間で何らかの種類の帯域幅バランスがある場合にのみ価値があります。そうでなければ、Windowsはすべてを同じ接続。

4

Range HTTP headerを使用して行います。完了したら

更新

最も簡単な方法は、スレッドごとに1 HttpWebRequestを使用することです(マルチスレッドの問題を回避するために)別々のファイルに各部分をダウンロードし、それらをマージします。答えをここに読む:HttpWebRequest or WebRequest - Resume Download ASP.NET

単に順序でそれらを読んで、(FileStreamクラスを使用して)新しいファイルに書き込み、ファイルをマージするには

+0

ありがとう、これは興味深いです。 –

+0

私の更新を読む。 – jgauffin

2

AddRangeでは、範囲のみをダウンロードできます。これにより、サーバーに特定の範囲にのみ関心があることを伝える範囲HTTPヘッダーフィールドが設定されます。複数の範囲が許可されます。

このメソッドは便利ではなく、オーバーヘッドだけが追加されるとのこともありました。 Imhoこれは状況によって異なりますが、サーバーは接続ごとに速度Xでシードするだけです。アクティブな接続でのみ、IP上でフィルタリングするものもあれば、フィルタリングするものもあります。だから、あなたのシナリオがうまくいく場合もあります。

関連する問題