Znaczenie bool IsReusable w interfejsie obsługi http

Odpowiedzi:

152

Normalnym punktem wejścia dla procedury obsługi jest metoda ProcessRequest. Jednak możesz mieć kod w konstruktorze klasy, który składa razem niektóre wartości instancji, które są drogie w tworzeniu.

Jeśli określisz opcję Reusable na true, aplikacja może buforować instancję i używać jej ponownie w innym żądaniu, po prostu wywołując jej metodę ProcessRequest, bez konieczności jej odtwarzania za każdym razem.

Aplikacja utworzy wystąpienie tylu z tych programów obsługi, ile potrzeba do obsługi bieżącego obciążenia.

Wadą jest to, że jeśli liczba potrzebnych instancji jest większa niż obecnie obecne, powodują one użycie większej ilości pamięci. I odwrotnie, mogą również zmniejszyć pozorne użycie pamięci, ponieważ ich wartość instancji przetrwa cykle GC i nie musi być często ponownie przydzielana.

Innym zastrzeżeniem jest to, że musisz mieć pewność, że pod koniec wykonywania ProcessRequest stan obiektu jest taki, jak chcesz, aby kolejne żądanie ponownego użycia obiektu.

AnthonyWJones
źródło
2
Wspomina się o ponownym użyciu obiektu jako kluczowej optymalizacji osiągniętej przez określenie IsReusable = True. Czy ustawienie IsReusable = False spowoduje, że serwer nigdy nie utworzy instancji wielu wystąpień procedury obsługi. IE - czy eliminuje jednoczesne żądania?
Ian
@Ian Uważam, że działa jak normalna strona, gdy wielokrotne użycie jest fałszywe, chociaż mogę się mylić. Gdy jest wielokrotnego użytku, może być w stanie obsłużyć 6 jednoczesnych żądań z 2 lub 3 instancjami (tylko przykład), podczas gdy gdy nie nadaje się do ponownego użycia, potrzebuje instancji / procesów 1: 1. Nie wyobrażam sobie .Net pozwoliłby na nagromadzenie żądań, gdy jeden wątek roboczy próbował obsłużyć to wszystko, ciągle odświeżając / ponownie inicjując swój stan.
DavidScherer
47

W nawiązaniu do odpowiedzi AnthonyWJones męska, jeśli HTTP Wózek powraca truedo IsReusablewówczas należy upewnić się, że jest on całkowicie bezpieczny wątku.

W dokumentacji nie ma nic, co wskazywałoby na to, że programy obsługi wielokrotnego użytku nie mogą być ponownie używane jednocześnie, chociaż obecne implementacje firmy Microsoft wydają się tylko ponownie używać ich kolejno. Ale przynajmniej w teorii pojedyncza instancja procedury obsługi mogłaby zostać ponownie wykorzystana jednocześnie przez wiele żądań, więc nie należy polegać na żadnych danych, które mogą zostać zmodyfikowane przez inne współbieżne wątki.

LukeH
źródło
Przepraszam, że jestem gruba, ale czy ktoś mógłby wyjaśnić, co oznacza „zmiana kontekstu”. Jeśli uzyskujesz dostęp do rzeczy z sesji lub ciągu zapytania (content.Request.QueryString), czy można to wykorzystać ponownie, czy nie?
zod
5
Przełączanie kontekstu ma miejsce, gdy procesor zatrzymuje przetwarzanie w jednym wątku i rozpoczyna przetwarzanie w innym. IE CPU przełączył swój kontekst z jednego wątku na inny. Dzieje się to stale na komputerach PC, dając nam złudzenie wielozadaniowości, zanim pojawiły się komputery wielordzeniowe.
Larry Dukek
Nie mogłem zrozumieć, kiedy powiedziałeś, że w każdej chwili może nastąpić zmiana kontekstu . Kiedy wpisujemy adres URL i wciskamy Enter, powoduje to wykonanie jednego żądania na raz. dobrze ?
Przełączanie kontekstu będzie problemem, gdy wielu użytkowników korzysta z aplikacji w tym samym czasie. Na przykład, jeśli dwóch użytkowników chce zaktualizować ten sam rekord w tym samym czasie, przełączenie kontekstu może spowodować problemy.
Ishmael Smyrnow
7
To stwierdzenie o IsReusablewymaganiu bezpieczeństwa nici wydaje się być sprzeczne z odpowiedzią Anthony'ego WJonesa. Jak rozumiem, jego trzeci akapit (aplikacja utworzy wystąpienie tylu z ...), instancja obsługi wielokrotnego użytku nie zostanie ponownie wykorzystana jednocześnie, ale dopiero po zakończeniu bieżącego przetwarzania. Jeśli to prawda, nie ma potrzeby zabezpieczania się wątkami.
Frédéric,
3

Jeśli nie przechowujesz żadnego stanu w tej instancji (tj. Nie masz żadnych pól (zwanych również „zmiennymi klas”)), możesz bezpiecznie użyć go ponownie.

Po bezpiecznej stronie domyślnie jest fałsz.

Andrei Rînea
źródło