Jaki jest pożytek z IHttpHandler.IsReusable?

105

Piszę IHttpHandleri będę musiał zaimplementować IsReusablewłaściwość. Kiedy patrzę na dokumentację MSDN , mówi:

Pobiera wartość wskazującą, czy inne żądanie może używać wystąpienia IHttpHandler.

To nie jest zbyt pomocne. W jakich sytuacjach należy używać programu obsługi wielokrotnego użytku, a w jakich sytuacjach nie powinien być on wielokrotnego użytku?

Dalsze pytania:

  1. Co to jest ponowne użycie?
  2. Czy mogę zachować stan (tj. Zmienne klasy), kiedy Reusable = true?
Kees C. Bakker
źródło
„Ponowne wykorzystanie” oznacza obsługę więcej niż jednego żądania z konkretną instancją programu obsługi. Możesz przechowywać wszystko w Session - nie będzie to miało wpływu po zwolnieniu instancji programu obsługi.
IrishChieftain
@IrishChieftain To tak, jakby .Net przechował paczkę utworzonych HttpHandlers, wybiera jeden i po prostu dostarcza mu kontekst?
Kees C. Bakker
1
@IrishChieftain w tej chwili używam go do prostego streamera niektórych informacji dziennika. Ale próbuję dowiedzieć się, jakie są implikacje, aby zrozumieć, kiedy i jak używać IHttpHandlers. Wielu zapomina o nich.
Kees C. Bakker

Odpowiedzi:

94

Ta właściwość wskazuje, czy wiele żądań może być przetwarzanych za pomocą tego samego wystąpienia IHttpHandler. Domyślnie na końcu potoku żądania wszystkie programy obsługi HTTP, które są umieszczane w handlerRecycleList HttpApplication mają ustawioną wartość null. Jeśli program obsługi jest wielokrotnego użytku, nie zostanie ustawiony na wartość null, a instancja zostanie ponownie wykorzystana w następnym żądaniu.

Głównym zyskiem jest wydajność, ponieważ będzie mniej obiektów do zebrania.
Najważniejszym problemem dla obsługi wielokrotnego użytku jest to, że musi być bezpieczny dla wątków. Nie jest to trywialne i wymaga pewnego wysiłku.

Osobiście sugeruję pozostawienie wartości domyślnej (bez możliwości ponownego użycia), jeśli używasz tylko zarządzanych zasobów, ponieważ Garbage Collector powinien z łatwością je obsłużyć. Wzrost wydajności dzięki programom obsługi wielokrotnego użytku jest zwykle pomijalny w porównaniu z ryzykiem wprowadzenia trudnych do znalezienia błędów związanych z wątkami.

Jeśli zdecydujesz się ponownie użyć procedury obsługi, powinieneś unikać utrzymywania stanu w zmiennych klasowych, ponieważ jeśli dostęp do instancji procedury obsługi jest uzyskiwany jednocześnie, wiele żądań zapisze / odczyta wartości.

Branislav Abadjimarinov
źródło
1
Twoja ostatnia rekomendacja unikania utrzymywania stanu w zmiennych klasowych jest nieco myląca. Zakładając, że ustawisz IsReusable na false, czy nie byłoby możliwości innego żądania (równoczesnego lub nie) dostępu do tego samego wystąpienia tego HttpHandler, a zatem utrzymanie stanu w zmiennych klasowych byłoby bezpieczne?
Ben Amada,
2
Pewnie. Przeformułowałem ostatnie zalecenie, podkreślając, że ma ono zastosowanie tylko wtedy, gdy IHttpHandler jest ponownie używany. Dzięki za wyjaśnienie, Ben!
Branislav Abadjimarinov
7
Ale to jest warte, zaimplementowałem wiele, wiele IHttpHandlerz IsReusableustawieniami truei nie miałem żadnych problemów. Najważniejszą rzeczą, o której należy pamiętać, jest to, aby żadne zmienne nie były ograniczone do klasy, ale raczej używaj zmiennych lokalnych w swoich funkcjach.
dana
6
Świetne wyjaśnienie. Jasne i na temat. Chciałbym, żeby artykuły MSDN były tak zwięzłe.
AlexVPerl
1
@Branislav - Jeśli dobrze rozumiem twoją odpowiedź. Czy różne wątki mogą nie tylko współbieżnie wykorzystywać różne instancje procedury obsługi, ale jest również możliwe, że różne wątki mogą jednocześnie wykonywać tę SAMĄ instancję procedury obsługi?
Ian
11

Najwyraźniej utrzymuje to program obsługi w pamięci i jest w stanie obsłużyć wiele żądań. Gdy ma wartość false, musi utworzyć nową instancję obsługi dla każdego przychodzącego żądania.

Oto pytanie, które pokazuje, co się dzieje, gdy nie jest prawidłowo używane:

Przesyłanie strumieniowe obrazów opartych na danych przy użyciu HttpHandler

IrishChieftain
źródło
Czy masz jakąś dokumentację potwierdzającą Twoją odpowiedź?
Kees C. Bakker
4
Podobnie jak Ty, nie mogłem znaleźć zadowalającej dokumentacji na MSDN, więc musiałem przetestować ładowanie obrazów z bazy danych na stronę witryny e-commerce, a następnie obserwować, co się stało :)
IrishChieftain
5

Recykling modułu obsługi jest tańszy niż tworzenie nowego za każdym razem, gdy przychodzi żądanie, a serwer będzie zużywał mniej pamięci, ułatwiając pracę, którą musi wykonać GC. Jeśli procedura obsługi jest w stanie, w którym obsłużenie nowego żądania nie byłoby problematyczne (tj. Jakikolwiek stan w instancji procedury obsługi został zresetowany) , to powinien kwalifikować się jako wielokrotnego użytku.

EDYTOWAĆ

Nie jestem pewien, czy moja odpowiedź poprawnie określa, czym jest ponowne użycie. W rzeczywistości pozwala na równoczesne ponowne użycie, więc efektywnego stanu najlepiej unikać lub ostrożnie zarządzać w sposób bezpieczny dla wątków.

wydający
źródło
Też bym tak myślał. Masz rację, rzeczywiste (podstawowe) pytanie brzmi: „co to jest ponowne wykorzystanie?”
Kees C. Bakker