Ostatnio, gdy pracowałem nad projektem, niektóre strony musiały załadować dużo danych, a czasem klikałem na stronę, nie czekając na jej załadowanie, a potem klikałem na kolejną stronę
Podczas ładowania strony internetowej będzie bardzo wolny stan zawieszonej animacji, więc przyjrzyjmy się temu uważnie dzisiaj.
Na początku myślałem, że taka sytuacja pojawi się na wielu stronach lub problem z prędkością sieci komputerowej, ale okazało się, że ta strona nie miała takiego problemu – czasem utknąłem podczas publikowania, ale klikałem na inne strony w zakładce, żeby szybko się załadować.
Przyjrzyjmy się temu dziś bliżej!! Kod testowany jako pierwszy:
Kod Homeview:
Kod kontrolera:
Do analizy kodu testowego nasz kontroler ma 3 metody: jedną jest strona główna, a pozostałe dwie to metody testowe
Żądanie Test1 blokuje się przez 5 sekund, a następnie zwraca dane użytkownikowi
Żądania Test2 nie będą blokować i zwracają dane bezpośrednio do użytkownika
Nasza strona główna to dwa interfejsy dla żądań Ajax, które są asynchroniczne, więc nie ma problemu z blokowaniem.
Stwierdzimy, że metoda Test1 generuje treść dopiero po tym, jak Test2 wygeneruje treść (Zazwyczaj strona generuje zawartość zwróconą bezpośrednio przez Test2, a następnie czeka 5 sekund, aby wyprowadzić treść zwróconą przez Test1, ponieważ js nie blokuje)
Następnie bezpośrednio uzyskujemy dostęp do interfejsów Test1 i Test2, najpierw Test1, a następnie natychmiast Test2 i okazuje się, że Test2 musi czekać, aż Test1 wróci do zakończenia, jak pokazano na poniższym rysunku:
Jeśli żądanie strony ustawi blokadę czytnika, inne żądania przetwarzane jednocześnie w tej samej sesji nie będą mogły zaktualizować stanu sesji, ale przynajmniej będą mogły być odczytane. Jeśli strona żąda blokady zapisu w stanie sesji, wszystkie pozostałe strony są blokowane, niezależnie od tego, czy chcą czytać czy zapisywać treść. Na przykład, jeśli dwa widoki programu zapisują treść w tej samej sesji w tym samym czasie, jeden program musi poczekać, aż drugi program zakończy pracę, zanim będzie można ją napisać. W programowaniu AJAX ważne jest, aby być świadomym tego zjawiska.
Specjalna uwaga: Tylko podczas zapisu sesji Asp.net zablokuje żądanie, ale pod warunkiem, że odwiedziłeś stronę, na której sesja jest zapisywana, na przykład operację po zalogowaniu do systemu z sesją (sesja jest zablokowana do momentu wygaśnięcia, oczywiście tylko jeśli SessionID jest taki sam). Pojawi się ten problem.
Informacje o internacie
Dopóki strona korzysta z sesji, każde żądanie blokuje sesję przez cały jej okres istnienia, więc żądania o tym samym sessionid muszą czekać na odblokowanie
Oznacza to, że jeśli strona ma stronę z limitem czasu, nie może nic zrobić i trzeba czekać, aż strona z limitem czasu się załaduje.
Ty też tego nie możesz, wiele jednoczesnych żądań Ajaxu na jednej stronie, nie da się tego zrobić, żądania o zapytanie wiadomości są wysyłane.
Podsumowując:Jeśli przeprowadzisz sesję do żądania, jeśli nie przeprowadzisz sesji na żądanie, powyższa sytuacja się nie wydarzy
Rozwiązanie:
Dodano funkcję SessionState(System.Web.SessionState.SessionState.ReadOnly) do kontrolera kontrolera
Nuta:
Wymagane oznacza, że żądasz wyłącznego zablokowania sesji (czyli braku równoległego przetwarzania żądań dla tego samego identyfikatora sesji) ReadOnly oznacza, że żądasz blokady niewyłącznej sesji (czyli twoje żądanie musi czekać na zakończenie żądań z wyłączną blokadą), ale możesz przetwarzać żądania z wyłącznymi blokadami zamki równoległe. Jednak to od ciebie zależy, by upewnić się, że twój kod nie będzie zapisywał się do Session. Nie jest to koniecznie egzekwowane przez ramy) Wymagane oznacza mutex sesji, o który poprosiłeś, (czyli nie ma potrzeby przetwarzania tego samego SessionID równolegle)
ReadOnly oznacza, że sesja, o którą prosisz, jest blokadą niewyłączną (tzn. Twoje żądanie musi poczekać na zakończenie, żądanie wyłącznej blokady, ale możesz przetworzyć żądanie z równoległą blokadą niewyłączną). Ale chcesz mieć pewność, że kod nie pisze sesji. Nie musi być wykonywana przez framework)
|