Nedávno, keď som pracoval na projekte, niektoré stránky potrebovali načítať veľa dát, a niekedy som klikol na stránku bez toho, aby som počkal, kým sa stránka dokončí načítať, a potom znova klikol na inú stránku
Pri načítavaní webovej stránky bude veľmi pomalý stav pozastavenej animácie, preto si to dnes dôkladne preštudujme.
Najprv som si myslel, že sa to stane na mnohých stránkach alebo na mojom probléme s rýchlosťou počítačovej siete, ale zistil som, že táto stránka túto situáciu nemá, niekedy som sa zasekol, keď som niečo zverejnil, ale klikol som na iné stránky v karte, aby sa rýchlo načítala.
Pozrime sa na to dnes bližšie!! Kód bol testovaný ako prvý:
Homeview kód:
Kód ovládača:
Na analýzu testovacieho kódu má náš kontrolér 3 metódy, jedna je domovská stránka a ďalšie dve sú testovacie metódy
Požiadavka Test1 blokuje na 5 sekúnd a potom vráti dáta používateľovi
Test2 požiadavky nebudú blokované a vrátia dáta priamo používateľovi
Naša domovská stránka má dve rozhrania pre Ajax požiadavky, ktoré sú asynchrónne, takže nie je problém s blokovaním.
Zistíme, že metóda Test1 vyprodukuje obsah až po tom, čo Test2 vyprodukuje obsah (Zvyčajne stránka vypíše obsah vrátený priamo Test2 a potom počká 5 sekúnd na výstup obsahu vráteného Test1, pretože js neblokuje)
Potom priamo pristupujeme k rozhraniam Test1 a Test2, najprv k Test1, potom ihneď k Test2 a zistíme, že Test2 musí počkať, kým sa Test1 vráti, aby dokončil, ako je znázornené na obrázku nižšie:
Ak požiadavka stránky nastaví zámok čítačky, ostatné požiadavky, ktoré sa spracúvajú súčasne v tej istej relácii, nebudú môcť aktualizovať stav relácie, ale aspoň sa dajú prečítať. Ak stránka požiada o zápisový zámok pre stav relácie, všetky ostatné stránky sú zablokované, bez ohľadu na to, či chcú čítať alebo zapisovať obsah. Napríklad, ak dva pohľady programu píšu obsah v tej istej relácii súčasne, jeden program musí počkať, kým druhý program dokončí, aby mohol byť napísaný. Pri programovaní AJAX je dôležité byť si toho vedomý.
Špeciálna poznámka: Iba pri zápise relácie Asp.net požiadavku zablokuje, ale pokiaľ ste navštívili stránku, kde sa relácia zapisuje, napríklad operácia po prihlásení do systému so reláciou (relácia je uzamknutá až do vypršania, samozrejme, SessionID je rovnaké). Bude tu tento problém.
Informácie o internete
Pokiaľ webová stránka používa reláciu, každá požiadavka ju uzamkne počas celej svojej životnosti, takže požiadavky s rovnakým sessionid musia počkať na odomknutie
To znamená, že ak má webová stránka stránku s časovým limitom, nemôže nič robiť a musíte čakať, kým sa načíta stránka s časovým limitom.
Ani to nemôžeš urobiť, viacero súbežných požiadaviek Ajaxu na jednej stránke, nemôžeš to urobiť, požiadavky na dotazovanie správ.
Na záver:Ak prijmete sedenie na žiadosť, ak neprinesiete sedenie na žiadosť, vyššie uvedená situácia sa nestane
Riešenie:
Pridaná funkcia SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly) do kontroléra
Nota:
Povinné znamená, že žiadate exkluzívny zámok na Session (t. j. žiadne paralelné spracovanie požiadaviek na ten istý sessionID) ReadOnly znamená, že žiadate o neexkluzívne uzamknutie relácie (t. j. vaša požiadavka musí stále čakať na dokončenie požiadaviek s exkluzívnym zámkom, ale môžete spracovávať požiadavky s neexkluzívnymi požiadavkami zámky paralelne. Avšak je na vás, aby ste zabezpečili, že váš kód nebude písať do Session. Nie je to nevyhnutne vynútené rámcom) Povinný znamená session mutex, ktorý ste požiadali (t. j. nie je potrebné spracovávať rovnaké SessionID paralelne)
ReadOnly znamená, že relácia, ktorú žiadate, je neexkluzívny zámok (t. j. vaša požiadavka musí stále čakať na dokončenie, požiadavka na exkluzívny zámok, ale môžete spracovať požiadavku s paralelným neexkluzívnym zámkom). Ale chceš sa uistiť, že tvoj kód nepíše relácie. Nemusí to byť vykonávané frameworkom)
|