2010-03-22 6 views
10

J'ai un client qui effectue un nombre limité de requêtes Web simultanées. J'utilise WebClient à cette fin. J'ai actuellement un pool de WebClient-s que je crée une fois et utilise celui qui est inactif. Mais cette approche devient un peu lourde, et je me demande s'il y a un avantage à avoir une collection d'instances WebClient préconstruites, ou si leur création à la volée ne poserait pas trop de problèmes?Surcharge de construction WebClient

Répondre

11

Pourquoi diable auriez-vous un pool de WebClients en premier lieu? Ce sont des objets minuscules et bon marché. Avez-vous déterminé en mesurant que cela est nécessaire et bénéfique? Je suppose pas?

L'instanciation d'objet est presque toujours bon marché. Les connexions HTTP ne sont pas chères non plus. Un pool WebClient est une optimisation prématurée. Vous n'en avez pas besoin - n'hésitez pas à en créer autant que vous le souhaitez.

+4

Eh bien, c'était la question que je posais - vaut la peine d'avoir une piscine. Merci d'avoir répondu. : p – Barguast

+1

"L'instanciation d'objet est presque toujours bon marché." ce n'est pas vrai. Peut-être relativement bon marché, relativement à des tâches d'entreprise ou de WCF, mais pour une application critique de performance qui est très importante. Il y a quelque temps, j'ai fait une application avec beaucoup d'initialisation d'objets "simples" en C#. Puis je l'ai réécrit en C et j'ai obtenu 4 fois plus de performance après l'avoir réécrite en C mais cette fois sans l'initialisation des objets simples (réutilisation des objets) et j'ai obtenu 3X perfomance grouth (par rapport à l'ancienne version C). Pas tant? –

8

Selon réflecteur tout ce que le constructeur de WebClient fait est ceci:

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

donc pas vous avantage pas beaucoup d'avoir une piscine.

+6

Il pourrait y avoir une initialisation paresseuse coûteuse ailleurs. – usr

+0

En outre, 'WebClient' est un' Component', qui est 'IDisposable'. – AbleArcher

0

Si vous utilisez .NET 4.0, vous pouvez paralléliser les requêtes Web. Vérifiez this sur.

Mais à la vraie question, je ne stockerais pas les instances de WebClient dans un tableau, s'il n'est pas nécessaire de réutiliser cette instance à d'autres endroits. Selon le but et le type d'utilisation, vous pouvez également avoir un pool de requêtes avec un dictionnaire de chaînes.

Ensuite, il suffit de réutiliser un client Web au lieu d'avoir plusieurs instances.