2009-02-11 14 views
124

Podczas pisania programu obsługi http/modułu, istnieje element interfejsu do implementacji o nazwie - bool IsReusable.Znaczenie bool IsReusable w interfejsie obsługi http

Jakie jest znaczenie tego członka? Jeśli ustawię wartość false (lub true), co to oznacza dla reszty aplikacji internetowej?

+0

[Wykorzystanie prawdziwego świata IHttpHandler.IsReuseable Property] (http://stackoverflow.com/questions/10806214/ihttphandler-isreusable-property-truly-usages) –

Odpowiedz

146

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

Jeśli określisz opcję Wielokrotnego użycia, aplikacja może buforować instancję i ponownie użyć jej w innym żądaniu, po prostu wywołując jej metodę ProcessRequest wielokrotnie, bez konieczności jej rekonstrukcji za każdym razem.

Aplikacja utworzy wiele tych procedur obsługi, które będą wymagały obsługi bieżącego obciążenia.

Wadą jest to, że jeśli potrzebna liczba instancji jest większa niż obecne instancje, powoduje to użycie większej ilości pamięci. I odwrotnie, mogą również zredukować pozorne wykorzystanie pamięci, ponieważ ich wartość instancji przetrwa cykle GC i nie trzeba często ich ponownie przyznawać.

Innym zastrzeżeniem jest upewnienie się, że na końcu procesu ProcessRequest stan obiektu jest taki, jaki chcesz dla innego żądania ponownego użycia obiektu.

+0

Wspomniałeś o ponownym użyciu obiektu jako o kluczowej optymalizacji uzyskanej dzięki określeniu IsReusable = Prawda. Ustawienie IsReusable = False wynik na serwerze, który nie tworzy instancji wielu instancji programu obsługi. TO ZNACZY. - czy eliminuje współbieżne żądania? – Ian

44

Oprócz odpowiedzi AnthonyWJones, jeśli twój handler HTTP zwróci true dla IsReusable, powinieneś upewnić się, że jest w pełni wątkowy.

W dokumentacji nie ma nic, co wskazywałoby, że obsługa wielokrotnego użytku nie może być ponownie używana jednocześnie, chociaż obecne implementacje Microsoft wydają się ponownie używać ich kolejno. Ale, przynajmniej teoretycznie, jedna instancja procedury obsługi może być ponownie użyta jednocześnie przez wiele żądań, więc nie powinieneś polegać na żadnych danych, które mogłyby być modyfikowane przez inne współbieżne wątki.

+0

Przepraszamy za bycie grubym, ale może ktoś proszę wyjaśnić, co rozumie się przez "przełącznik kontekstowy". Jeśli uzyskujesz dostęp do rzeczy z sesji lub łańcucha zapytania (content.Request.QueryString), czy można go użyć ponownie, czy nie? – zod

+4

Przełączanie kontekstu następuje, gdy procesor przestaje przetwarzać jeden wątek i rozpoczyna przetwarzanie na innym. TO ZNACZY. CPU przełączył kontekst z jednego wątku na inny. Dzieje się to ciągle w komputerach, dało nam złudzenie wielozadaniowości, zanim pojawiły się komputery wielordzeniowe. – TwistedStem

+0

Nie mogłem zrozumieć, kiedy powiedziałeś ** W każdej chwili może być przełącznik kontekstu **. Kiedy wpisujemy url i wciskamy enter, wykonuje to jedno żądanie na raz. dobrze ? –

3

Jeśli nie zachowujesz żadnego stanu w tym wystąpieniu (tzn. Nie masz żadnych pól (inaczej "zmiennych klasowych")), powinieneś bezpiecznie je wykorzystać.

Domyślnie wartość false jest bezpieczna.