Lors de l'écriture d'un gestionnaire / module http, il y a un membre d'interface à implémenter appelé - bool IsReusable .
Quelle est la signification de ce membre? Si je le définis sur false (ou true), qu'est-ce que cela signifie pour le reste de l'application Web?
asp.net
httphandler
ihttphandler
GurdeepS
la source
la source
Réponses:
Le point d'entrée normal d'un gestionnaire est la méthode ProcessRequest. Cependant, vous pouvez avoir du code dans le constructeur de classe qui rassemble des valeurs d'instance qui sont coûteuses à construire.
Si vous spécifiez Reusable pour être true, l'application peut mettre en cache l'instance et la réutiliser dans une autre requête en appelant simplement sa méthode ProcessRequest encore et encore, sans avoir à la reconstruire à chaque fois.
L'application instanciera autant de ces gestionnaires que nécessaire pour gérer la charge actuelle.
L'inconvénient est que si le nombre d'instances nécessaires est supérieur aux instances actuellement présentes, elles entraînent l'utilisation de plus de mémoire. À l'inverse, ils peuvent également réduire les utilisations apparentes de la mémoire, car leur valeur d'instance survivra aux cycles GC et n'a pas besoin d'être réallouée fréquemment.
Une autre mise en garde est que vous devez vous assurer qu'à la fin de l'exécution de ProcessRequest, l'état de l'objet est comme vous le souhaiteriez pour une autre demande de réutilisation de l'objet.
la source
Suite à la réponse d'AnthonyWJones, si votre gestionnaire HTTP revient
true
pour,IsReusable
vous devez vous assurer qu'il est entièrement thread-safe.Rien dans la documentation n'indique que les gestionnaires réutilisables ne peuvent pas être réutilisés simultanément, bien que les implémentations actuelles de Microsoft ne semblent les réutiliser que consécutivement. Mais, au moins en théorie, une seule instance de gestionnaire pourrait être réutilisée simultanément par plusieurs requêtes, vous ne devriez donc pas vous fier à des données qui pourraient être modifiées par d'autres threads concurrents.
la source
IsReusable
exiger la sécurité des threads semble en contradiction avec la réponse d'AnthonyWJones. Si je comprends bien son troisième paragraphe (l'application instanciera autant de ...), une instance de gestionnaire réutilisable ne sera pas réutilisée simultanément, mais seulement après avoir terminé son traitement actuel. Si cela est vrai, il n'est pas nécessaire d'être thread-safe.Si vous ne stockez aucun état dans cette instance (c'est-à-dire: vous n'avez aucun champ (aka "variables de classe")), vous devriez le réutiliser en toute sécurité.
C'est faux par défaut pour être du bon côté.
la source