web-dev-qa-db-fra.com

À quoi sert IHttpHandler.IsReusable?

J'écris un IHttpHandler et je devrai implémenter une propriété IsReusable. Quand je regarde le documentation MSDN il dit:

Obtient une valeur indiquant si une autre demande peut utiliser l'instance IHttpHandler.

Ce n'est pas très utile. Dans quelles situations devrais-je utiliser un gestionnaire réutilisable et dans quelles situations ne devrait-il pas être réutilisable?

Questions de suivi:

  1. Qu'est-ce que la réutilisation?
  2. Puis-je maintenir l'état (c'est-à-dire les variables de classe) lorsque Reusable = true ??
101
Kees C. Bakker

Cette propriété indique si plusieurs demandes peuvent être traitées avec la même instance IHttpHandler. Par défaut, à la fin d'un pipeline de demandes, tous les gestionnaires http placés dans handlerRecycleList de HttpApplication sont définis sur null. Si un gestionnaire est réutilisable, il ne sera pas défini sur null et l'instance sera réutilisée dans la prochaine demande.

Le gain principal est la performance car il y aura moins d'objets à ramasser.
L'inconvénient le plus important pour un gestionnaire réutilisable est qu'il doit être thread-safe. Ce n'est pas anodin et nécessite un certain effort.

Personnellement, je vous suggère de laisser le comportement par défaut (non réutilisable) si vous utilisez uniquement des ressources gérées car le garbage collector devrait facilement les gérer. Le gain de performances des gestionnaires réutilisables est généralement négligeable par rapport au risque d'introduire des bogues de threading difficiles à trouver.

Si vous décidez de réutiliser le gestionnaire, vous devez éviter de conserver l'état dans les variables de classe, car si l'instance du gestionnaire est accédée simultanément, plusieurs demandes écriront/liront les valeurs.

93

Apparemment, cela garde le gestionnaire en mémoire et capable de gérer plusieurs demandes. Lorsqu'il est défini sur false, il doit créer une nouvelle instance du gestionnaire pour chaque demande entrante.

Voici une question qui montre ce qui se passe lorsqu'il n'est pas utilisé correctement:

Diffusion d'images basées sur des données à l'aide de HttpHandler

11
IrishChieftain

Il est moins coûteux de recycler le gestionnaire que d'en créer un nouveau chaque fois qu'une demande arrive et le serveur consommera moins de mémoire, ce qui facilitera le travail du GC. Si le gestionnaire est dans un état où le traitement d'une nouvelle demande ne serait pas problématique (c'est-à-dire que tout état dans l'instance de gestionnaire a été réinitialisé), alors il doit être considéré comme réutilisable.

ÉDITER

Je ne sais pas si ma réponse définit correctement ce qu'est la réutilisation. Il permet en fait une réutilisation simultanée, il est donc préférable d'éviter efficacement l'état ou de le gérer soigneusement de manière thread-safe.

5
spender