2012-09-26 8 views
5

Problema: Necesito descargar cientos de imágenes de diferentes hosts. Cada host tiene entre 20 y cientos de imágenes.¿Es WebClient la mejor manera de descargar datos http?

Solución: utilizando un new WebClient cada vez que se necesita descargar una imagen a través del método DownloadData de WebClient.

¿O sería mejor mantener un grupo de conexiones de socket abierto y hacer la solicitud http utilizando llamadas de nivel inferior?

¿Es costoso abrir/cerrar una conexión tcp (supongo que es lo que hace WebClient), de modo que el uso de pools suena más eficiente?

+0

El mejor código es el código que logra los resultados que necesitas sin errores en el tiempo que necesites. Entonces, ¿puede comentar qué necesita mejorar en comparación con su código actual (suponiendo que haya hecho estimaciones de la velocidad con la que puede descargar imágenes y las descargas de códigos actuales más lentas que sus objetivos, pero que tenga margen para mejorar hasta llegar a los límites de la red). –

+0

Debería haber agregado que la velocidad es la mayor preocupación. – sanjosep43

+0

+1 Pregunta muy interesante. –

Respuesta

6

Creo que la infraestructura subyacente que usa WebClient ya agrupará conexiones HTTP, por lo que no es necesario hacerlo. Es posible que desee comprobar el uso de algo como Wireshark, por supuesto, con algunas URL de muestra.

Fundamentalmente, tomaría el mismo enfoque para esto que con otras tareas de programación: escriba el código de la manera más simple que funcione, y luego verifique si funciona lo suficientemente bien para sus necesidades. Si lo hace, terminaste. Si no es así, use las herramientas adecuadas (analizadores de red, etc.) para resolver por qué no está funcionando lo suficientemente bien, y use código más complicado solo si soluciona el problema.

Mi experiencia es que WebClient está bien si no es lo que necesita, pero no le da un control tan preciso como WebRequest. Si no lo hace necesita ese control, vaya con WebClient.

+0

Gracias. No pensé que WebClient usaría un grupo. Tendré que verificarlo con wireshark. ¡También leo tu libro, que fue muy bueno! – sanjosep43

+0

@ user261490 El libro de Jon es sorprendente, pero este comentario no es relevante para la pregunta. Intente hacer que sus comentarios sean relevantes para la pregunta o la respuesta, por lo que sería útil para otros –

+0

@ user261490 Jon está aquí. Una cosa a considerar es buscar en las [bibliotecas paralelas] (http://msdn.microsoft.com/en-us/library/dd460720.aspx) de MS en combinación con lo que elija. Esto le permitirá descargar en múltiples hilos, limitado por ancho de banda, por supuesto. Asegúrate de Cerrar() las conexiones cuando termines también ... Cometí ese error una vez. – iMortalitySX

0

Yo uso HttpWebRequest y HttpWebResponse para raspar cualquier cosa que quiera. A menos que, por supuesto, existan servicios disponibles para el requisito, pero a pesar de que, a veces, existen limitaciones (limitaciones comerciales) y a menudo prefiero cavar el html de la pura solicitud HTTP. A veces simplemente hace que te sientas más como desarrollador, ya sabes ...

+3

No has dado ninguna razón * por qué * usas 'HttpWebRequest' /' HttpWebResponse', lo que hace que esta respuesta sea menos útil de lo que podría ser. –

Cuestiones relacionadas