2010-03-22 13 views
10

Tengo un cliente que realiza un número limitado de solicitudes web concurrentes. Uso WebClient para este propósito. Actualmente tengo un conjunto de WebClient-s que creo una vez y uso el que esté inactivo.Sobrecarga de construcción WebClient

Sin embargo, este enfoque se está volviendo un poco engorroso, y me pregunto si hay algún beneficio de tener una colección de instancias WebClient preconstruidas, o si crearlas sobre la marcha no sería demasiado problema.

Respuesta

11

¿Por qué demonios tendrías un grupo de WebClients en primer lugar? Son objetos pequeños y baratos. ¿Lo determinaste midiendo que esto es necesario y beneficioso? Supongo que no?

La creación de instancias de objetos es casi siempre barata. Las conexiones HTTP tampoco son costosas. Un grupo de WebClient es una optimización prematura. No hay necesidad, siéntete libre de crear tantos como quieras.

+4

Bueno, esa era la pregunta que estaba haciendo: ¿vale la pena tener un grupo? Gracias por responderlo. : p – Barguast

+1

"La instanciación de objetos es casi siempre barata". eso no es verdad. Tal vez relativamente barato, relativamente a las tareas de negocios o WCF, pero para la aplicación crítica de rendimiento que es muy significativo. Hace algún tiempo, hice algunas aplicaciones con una gran cantidad de inicialización de objetos "simples" en C#. Luego lo reescribí en C y obtuve una mejora de rendimiento de 4x después de haberlo reescrito en C pero esta vez sin inicialización de objetos "simples" (reutilización de objetos) y obtuve 3X de rendimiento grouth (relativo a la antigua versión C) que es 12X sobre C#. ¿No mucho? –

8

De acuerdo con reflector todo lo que el constructor del cliente Web que hace es la siguiente:

public WebClient() 
{ 
    this.m_Encoding = Encoding.Default; 
    this.m_ContentLength = -1L; 
} 

Así que no tiene no mucho beneficio de tener una piscina.

+6

Podría haber una costosa inicialización perezosa en otro lugar. – usr

+0

Además, 'WebClient' es un' Component', que es 'IDisposable'. – AbleArcher

0

Si está utilizando .NET 4.0 puede paralelizar las solicitudes web. Compruebe this hacia fuera.

Pero a la pregunta real, no almacenaría las instancias del WebClient en una matriz, si no hay necesidad de volver a utilizar esa instancia en otros lugares. Dependiendo de la finalidad y el tipo de uso, también podría tener un conjunto de solicitudes con un diccionario de cadenas.

Y luego solo reutilice un WebClient en lugar de tener varias instancias.