2011-11-07 23 views
5

Quiero descargar un solo archivo con Multi-Threads en C#. por ejemplo: Thread1 comienza a descargar del 1% al 40%. Thread2 comienza a descargar del 41% al 70%. Thread3 comienza a descargar del 71% al 100%cómo descargar un solo archivo con varios subprocesos en C#

Por favor, sugierame un código. Gracias de antemano

+2

¿Su conexión de red está completamente utilizada? Si es así, no puede acelerar la descarga con múltiples hilos. –

+3

Esto no ayudará. Esto solo agregará sobrecarga. –

+0

¿Por qué suponer que es el lado del cliente/ancho de banda el problema? Puede ser útil si el servidor web utiliza algún tipo de aceleración que no verifica si hay varias conexiones del mismo cliente. – jgauffin

Respuesta

4

Cómo sobre el uso HttpRequest clase, con el método AddRange llamada. Esto debería ser un encabezado con desplazamiento desde el cual comenzar a descargar.

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

A continuación, puede leer los datos'responseStream' y fusionarlo con los otros hilos vez que se hace.

Sin embargo, como notaron todos, esto solo traerá valor si tiene dos adaptadores, ambos conectados a internet, y tiene algún tipo de equilibrio de ancho de banda entre esos adaptadores ... De lo contrario, Windows probablemente desvíe todo a la misma conexión.

4

Lo haces usando el Range HTTP header. Descargar cada parte a un archivo separado y unirlos cuando se hace (para evitar problemas de múltiples subprocesos)

actualización

La forma más sencilla es utilizar uno HttpWebRequest por hilo. Lea la respuesta aquí: HttpWebRequest or WebRequest - Resume Download ASP.NET

para combinar los archivos, sólo tiene que leer en secuencia y escribir en un archivo nuevo (usando FileStream clase)

+0

Gracias, esto es interesante. –

+0

Lee mi actualización. – jgauffin

2

El AddRange le permite descargar solo el rango. Esto configurará el campo de encabezado HTTP de rango que le indicará al servidor que usted está interesado en un cierto rango. Se permiten múltiples rangos.

Algunas personas mencionaron que este método no es útil y solo agregará sobrecarga. Imho esto depende de la situación, son servidores que solo se siembran a la velocidad X por conexión. Algunos filtran en IP, otros solo en la conexión activa. Entonces, en algunas situaciones su escenario funcionaría.

Cuestiones relacionadas