Piszę IHttpHandler
i będę musiał zaimplementować IsReusable
wł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:
- Co to jest ponowne użycie?
- Czy mogę zachować stan (tj. Zmienne klasy), kiedy
Reusable = true
?
c#
asp.net
asp.net-mvc
ihttphandler
system.web
Kees C. Bakker
źródło
źródło
Odpowiedzi:
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.
źródło
IHttpHandler
zIsReusable
ustawieniamitrue
i 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.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
źródło
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.
źródło