Signification de bool IsReusable dans l'interface du gestionnaire http

Réponses:

152

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.

AnthonyWJones
la source
2
Vous mentionnez la réutilisation des objets comme étant l'optimisation clé obtenue en spécifiant IsReusable = True. Le paramètre IsReusable = False empêchera le serveur d'instancier plusieurs instances du gestionnaire. IE - élimine-t-il les demandes simultanées?
Ian
@Ian Je crois que cela fonctionne alors comme une page normale lorsque réutilisable est faux, bien que je puisse me tromper. Lorsqu'il est réutilisable, il peut être capable de gérer 6 requêtes simultanées avec 2 ou 3 instances (exemple uniquement), alors que lorsqu'il n'est pas réutilisable, il aurait besoin d'instances / processus 1: 1. Je ne peux pas imaginer .Net laisserait les demandes s'accumuler alors qu'un thread de travail essayait de tout gérer tout en actualisant / réinitialisant continuellement son état.
DavidScherer
47

Suite à la réponse d'AnthonyWJones, si votre gestionnaire HTTP revient truepour, IsReusablevous 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.

LukeH
la source
Désolé d'être épais, mais quelqu'un pourrait-il expliquer ce que l'on entend par «changement de contexte». Si vous accédez à des éléments à partir du sesson ou de la chaîne de requête (content.Request.QueryString), est-ce réutilisable ou non?
zod
5
Le changement de contexte se produit lorsqu'un processeur arrête le traitement sur un thread et commence le traitement sur un autre. IE le CPU a changé son contexte d'un thread à un autre. Cela se produit constamment dans les PC, cela nous a donné l'illusion du multitâche avant qu'il y ait des ordinateurs multicœurs.
Larry Dukek le
Je ne pouvais pas comprendre quand tu as dit qu'il pouvait y avoir un changement de contexte à tout moment . Lorsque nous tapons url et appuyons sur Entrée, cela exécute une demande à la fois. droite ?
Le changement de contexte sera un problème lorsque plusieurs utilisateurs utilisent une application en même temps. Par exemple, si deux utilisateurs souhaitent mettre à jour le même enregistrement en même temps, le changement de contexte peut provoquer des problèmes.
Ishmael Smyrnow
7
Cette déclaration d' IsReusableexiger 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.
Frédéric le
3

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é.

Andrei Rînea
la source