J'écris un IHttpHandler
et je vais devoir implémenter une IsReusable
propriété. Quand je regarde la 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 dois-je utiliser un gestionnaire réutilisable et dans quelles situations ne doit-il pas être réutilisable?
Questions de suivi:
- Qu'est-ce que la réutilisation?
- Puis-je maintenir l'état (c'est-à-dire les variables de classe) quand
Reusable = true
??
c#
asp.net
asp.net-mvc
ihttphandler
system.web
Kees C. Bakker
la source
la source
Réponses:
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 qui sont placés dans le 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 requête.
Le principal gain est la performance car il y aura moins d'objets à ramasser.
Le problème le plus important pour le gestionnaire réutilisable est qu'il doit être thread-safe. Ce n'est pas anodin et nécessite quelques efforts.
Je vous suggère personnellement de laisser la valeur par défaut (non réutilisable) si vous n'utilisez que 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 thread 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 de gestionnaire est accédée simultanément, plusieurs requêtes écriront / liront les valeurs.
la source
IHttpHandler
avecIsReusable
set totrue
et je n'ai eu aucun problème. La chose principale à garder à l'esprit est de ne pas avoir de variables étendues à la classe, mais plutôt d'utiliser des variables locales dans vos fonctions.Apparemment, cela garde le gestionnaire en mémoire et est capable de gérer plusieurs requêtes. Lorsqu'il est défini sur false, il doit créer une nouvelle instance du gestionnaire pour chaque requête entrante.
Voici une question qui montre ce qui se passe lorsqu'il n'est pas utilisé correctement:
Diffusion d'images à base de données à l'aide de HttpHandler
la source
Il est moins coûteux de recycler le gestionnaire que d'en créer un nouveau à chaque fois qu'une requête arrive et le serveur consomme moins de mémoire, ce qui facilite le travail que GC doit effectuer. Si le gestionnaire est dans un état où le traitement d'une nouvelle requête ne serait pas problématique
(c'est-à-dire que tout état de l'instance du gestionnaire a été réinitialisé), alors il devrait ê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, donc il vaut mieux éviter efficacement l'état ou le gérer soigneusement de manière thread-safe.
la source