Nedávno, když jsem pracoval na projektu, některé stránky potřebovaly načíst hodně dat, a někdy jsem klikl na stránku, aniž bych čekal, až se stránka načte, a pak znovu klikl na jinou stránku
Při načítání webové stránky bude velmi pomalý stav pozastavené animace, takže si to dnes pečlivě prostudujeme.
Zpočátku jsem si myslel, že se to stane na mnoha webech nebo na mém problému s rychlostí počítačové sítě, ale zjistil jsem, že tento web tento problém nemá, někdy jsem se při zveřejnění zasekl, ale klikl jsem na jiné stránky v záložce a rychle se načetl.
Pojďme se na to dnes podívat blíže!! Kód byl testován jako první:
Homeview kód:
Kód ovladače:
Pro analýzu testovacího kódu má náš kontrolér 3 metody, jedna je domovská stránka a další dvě jsou testovací metody
Požadavek Test1 blokuje na 5 sekund a poté vrátí data uživateli
Dotazy Test2 neblokují a data budou přímo vracet uživateli
Naše domovská stránka má dvě rozhraní pro požadavky Ajaxu, což jsou asynchronní požadavky, takže není problém s blokováním.
Zjistíme, že metoda Test1 vydává obsah až poté, co Test2 vyprodukuje obsah (Obvykle stránka vypíše obsah vrácený Test2 přímo a poté počká 5 sekund, než vygeneruje obsah vrácený Test1, protože js neblokuje)
Poté přímo přistupujeme k rozhraním Test1 a Test2, nejprve k Test1, a pak ihned k Test2, a zjistíme, že Test2 musí počkat, až se Test1 vrátí, aby dokončil, jak je znázorněno na obrázku níže:
Pokud požadavek na stránku nastaví zámek čtečky, ostatní požadavky, které jsou zpracovávány současně ve stejné relaci, nebudou schopny aktualizovat stav relace, ale alespoň je lze číst. Pokud stránka požádá o zápis pro stav relace, jsou všechny ostatní stránky blokovány, bez ohledu na to, zda chtějí obsah číst nebo zapisovat. Například pokud dva pohledy programu píší obsah ve stejné relaci současně, jeden program musí počkat, až druhý program dokončí, než jej může napsat. V programování AJAX je důležité být si toho vědom.
Speciální poznámka: Pouze při zápisu relace Asp.net požadavek zablokuje, ale pokud jste navštívili stránku, kde je relace zapsána, například operace po přihlášení do systému se sezením (relace je samozřejmě uzamčena až do vypršení platnosti, pouze pokud je SessionID stejné). Bude tu tento problém.
Informace o internetových uživatelích
Pokud web používá relaci, každý požadavek ji uzamkne po celou dobu života, takže požadavky se stejným sessionid musí čekat na odemčení
To znamená, že pokud má web stránku s časovým limitem, nemůže nic dělat a musíte čekat, až se časově omezená stránka načte.
Ani to nejde, více současných požadavků Ajaxu na jedné stránce to nejde, dotazy na dotazování zpráv.
Shrnuto:Pokud přijmete sezení k požadavku, pokud nepřinesete sezení k požadavku, výše uvedená situace se nestane
Řešení:
Přidán je funkce SessionState(System.Web.SessionState.SessionState.ReadOnly) do řadiče
Poznámka:
Povinné znamená, že žádáte o exkluzivní zámek na Session (tj. žádné paralelní zpracování požadavků na stejný sessionID) ReadOnly znamená, že žádáte o neexkluzivní zámek na relaci (tj. váš požadavek musí stále čekat na dokončení požadavků s exkluzivním zámkem, ale můžete zpracovávat požadavky s neexkluzivním zámky paralelně. Nicméně je na vás, abyste zajistili, že váš kód nebude psát do Session. Není to nutně vynucováno rámcem) Required znamená session mutex, o který jste žádali (tj. není nutné zpracovávat stejné SessionID paralelně)
ReadOnly znamená, že relace, kterou požadujete, je neexkluzivní zámek (tj. váš požadavek musí stále čekat na dokončení, požadavek na exkluzivní zámek, ale můžete zpracovat požadavek s paralelním neexkluzivním zámkem). Ale chcete se ujistit, že váš kód nepíše relace. Nemusí to být prováděno frameworkem)
|