2011-11-07 21 views
5

Voglio scaricare un singolo file con Multi-Thread in C#. ad esempio: Thread1 avvia il download dall'1% al 40%. Thread2 inizia il download dal 41% al 70%. Thread3 inizia a scaricare dal 71% al 100%come scaricare un singolo file con multi-thread in C#

Per favore suggerire qualche codice. Grazie in anticipo

+2

La connessione di rete è completamente utilizzata? In tal caso, non è possibile accelerare il download con più thread. –

+3

Questo non aiuta. Questo aggiungerà solo un sovraccarico. –

+0

Perché supporre che è il lato client/larghezza di banda che è il problema? Può essere d'aiuto se il web server utilizza una sorta di limitazione che non controlla se più connessioni provengono dallo stesso client. – jgauffin

risposta

4

Come sull'utilizzo HttpRequest di classe, con il metodo AddRange chiamato. Questo dovrebbe avere un'intestazione con offset da cui iniziare il download.

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

È quindi possibile leggere dal'responseStream' i dati e si fondono con gli altri thread una volta che si è fatto.

Tuttavia, come notato da tutti gli altri, questo porterà valore solo se si hanno due adattatori, entrambi collegati a Internet, e si ha una sorta di bilanciamento della larghezza di banda tra questi adattatori ... In caso contrario Windows probabilmente devierà tutto al stessa connessione.

4

Lo si utilizza utilizzando lo Range HTTP header. Scarica ogni parte in un file separato e unirli quando fatto (per evitare problemi di multi-threading)

Aggiornamento

Il modo più semplice è quello di utilizzare una HttpWebRequest per thread. Leggi la risposta qui: HttpWebRequest or WebRequest - Resume Download ASP.NET

per unire i file, è sufficiente leggere in sequenza e scrivere in un nuovo file (utilizzando FileStream classe)

+0

Grazie, questo è interessante. –

+0

Leggi il mio aggiornamento. – jgauffin

2

AddRange consente di scaricare solo intervallo. Questo imposterà il campo di intestazione HTTP della gamma che dirà al server che sei interessato solo a un determinato intervallo. Sono consentiti più intervalli.

Alcune persone hanno menzionato che questo metodo non è utile e aggiungerà solo un sovraccarico. Imho questo dipende dalla situazione, i loro sono server che seminano solo alla velocità X per connessione. Alcuni filtreranno su IP, altri solo sulla connessione attiva. Quindi in alcune situazioni il tuo scenario funzionerebbe.