2010-03-22 4 views
10

Ich habe einen Client, der eine begrenzte Anzahl von gleichzeitigen Web-Anfragen macht. Ich benutze den WebClient für diesen Zweck. Ich habe derzeit einen Pool von WebClient-s, die ich einmal erstellt habe und benutze, was auch immer im Leerlauf ist.WebClient Konstruktion Overhead

Dieser Ansatz wird jedoch ein wenig umständlich, und ich frage mich, ob es einen Vorteil hat, eine Sammlung von vorbereiteten WebClient-Instanzen zu haben, oder ob die Erstellung im laufenden Betrieb nicht zu viel Mühe machen würde?

Antwort

11

Warum in aller Welt hätten Sie einen Pool von WebClients? Sie sind winzige, billige Objekte. Haben Sie festgestellt, dass dies notwendig und nützlich ist? Ich nehme nicht an?

Objekt Instanziierung ist fast immer billig. HTTP-Verbindungen sind auch nicht teuer. Ein WebClient-Pool ist eine vorzeitige Optimierung. Es gibt keinen Grund dafür - erstellen Sie so viele, wie Sie möchten.

+4

Nun, das war die Frage, die ich stellte - lohnt es sich, einen Pool zu haben? Danke, dass du es beantwortet hast. : p – Barguast

+1

"Objekt Instanziierung ist fast immer billig." das ist nicht wahr. Vielleicht relativ günstig, relativ zu Business- oder WCF-Aufgaben, aber für eine leistungskritische Anwendung, die sehr wichtig ist. Vor einiger Zeit habe ich eine App mit vielen "einfachen" Objekten in C# initialisiert. Dann habe ich es in C umgeschrieben und bekam 4x Performance-Verbesserung, nachdem ich es in C aber diesmal ohne "einfache" Objekte Initialisierung (Wiederverwendung von Objekten) umgeschrieben habe und 3X Leistung grout (relativ zu alter C-Version) das ist 12X über C#. Nicht viel? –

8

Nach Reflector alle, dass der Konstruktor von WebClient tut, ist dies:

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

Also nein Sie haben nicht viel Nutzen über einen Pool zu haben.

+6

Es könnte an anderer Stelle eine teure Lazy-Initialisierung geben. – usr

+0

"WebClient" ist auch eine "Komponente", die "IDisposable" ist. – AbleArcher

0

Wenn Sie .NET 4.0 verwenden, können Sie die Webanforderungen parallelisieren. Überprüfen Sie this aus.

Aber um die eigentliche Frage, würde ich nicht die Instanzen des WebClient in einem Array speichern, wenn es nicht notwendig ist, diese Instanz an anderen Orten zu verwenden. Je nach Verwendungszweck und Art der Nutzung könnte auch ein Request Pool mit einem String Dictionary vorhanden sein.

Und dann wieder nur einen WebClient statt mehrere Instanzen verwenden.