2010-03-22 16 views
10

Possiedo un client che esegue un numero limitato di richieste Web simultanee. Io uso WebClient per questo scopo. Al momento ho un pool di WebClient-s che creo una volta e uso qualunque sia inattivo.Overhead di costruzione WebClient

Questo approccio sta diventando un po 'ingombrante, e mi chiedo se ci sia qualche vantaggio per avere una raccolta di istanze WebClient pre-costruite, o se la creazione al volo non sarebbe troppo disturbo?

risposta

11

Perché mai dovresti disporre di un pool di WebClient? Sono oggetti piccoli e economici. Hai determinato misurando che questo è necessario e vantaggioso? Presumo di no?

L'istanziazione degli oggetti è quasi sempre economica. Anche le connessioni HTTP non sono costose. Un pool WebClient è l'ottimizzazione prematura. Non ce n'è bisogno: sentiti libero di crearne quante ne vuoi.

+4

Bene, questa era la domanda che stavo ponendo - vale la pena avere una piscina. Grazie per averlo risposto : p – Barguast

+1

"L'istanza degli oggetti è quasi sempre a buon mercato." quello non è vero. Forse compiti relativamente economici, relativamente business o WCF, ma per applicazioni critiche di prestazioni che sono molto significative. Qualche tempo fa ho realizzato alcune app con molti "semplici" oggetti di inizializzazione in C#. Poi l'ho riscritto in C e ho ottenuto un miglioramento delle prestazioni 4x dopo che l'ho riscritto in C ma questa volta senza inizializzazione di oggetti "semplici" (riutilizzo oggetti) e ottenuto grouth di perfomance 3X (relativo alla vecchia versione C) 12X su C#. Non tanto? –

8

Secondo Reflector tutto ciò che il costruttore di WebClient non fa altro che questo:

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

Quindi, non si dispone di non molto vantaggio di avere una piscina.

+6

Potrebbe esserci un'iniziale inizializzazione pigra altrove. – usr

+0

Inoltre, 'WebClient' è un' Componente', che è 'IDisposable'. – AbleArcher

0

Se si utilizza .NET 4.0 è possibile parallelizzare le Richieste Web. Controllare this out.

Ma per la vera domanda, non memorizzerei le istanze del WebClient in una matrice, se non è necessario riutilizzare quell'istanza in altri posti. A seconda dello scopo e del tipo di utilizzo si potrebbe anche avere un pool di richieste con un dizionario stringa.

E quindi basta riutilizzare un WebClient anziché avere più istanze.