web-dev-qa-db-fra.com

Signification de bool IsReusable dans l'interface du gestionnaire http

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 faux (ou vrai), qu'est-ce que cela signifie pour le reste de l'application Web?

128
GurdeepS

Le point d'entrée normal pour 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 Réutilisable pour être vrai, l'application peut mettre en cache l'instance et la réutiliser dans une autre demande en appelant simplement sa méthode ProcessRequest à plusieurs reprises, 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 plus grand que les instances actuellement présentes, elles entraînent l'utilisation de plus de mémoire. Inversement, 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 fréquemment réallouée.

Une autre mise en garde est que vous devez être sûr qu'à la fin de l'exécution de ProcessRequest, l'état de l'objet est tel que vous le souhaiteriez pour une autre demande de réutilisation de l'objet.

150
AnthonyWJones

Suite à la réponse d'AnthonyWJones, si votre gestionnaire HTTP renvoie 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 Microsoft actuelles semblent les réutiliser consécutivement. Mais, au moins en théorie, une seule instance de gestionnaire peut être réutilisée simultanément par plusieurs demandes, vous ne devez donc pas vous fier à des données qui pourraient être modifiées par d'autres threads simultanés.

46
LukeH

Si vous ne stockez aucun état dans cette instance (c'est-à-dire que vous n'avez aucun champ (alias "variables de classe")), vous devriez le réutiliser en toute sécurité.

Il est faux par défaut d'être du bon côté.

3
Andrei Rînea