Nedavno, ko sem delal na projektu, so nekatere strani morale naložiti veliko podatkov, in včasih sem kliknil na stran, ne da bi počakal, da se stran dokonča naložiti, nato pa spet kliknil na drugo stran
Med nalaganjem spletne strani bo zelo počasno stanje zamrznjene animacije, zato si ga danes podrobno oglejmo.
Sprva sem mislil, da se bo to zgodilo na mnogih spletnih straneh ali težavah s hitrostjo računalniškega omrežja, a sem ugotovil, da ta stran tega ni imela; včasih sem se zataknil, ko sem objavil, a sem kliknil na druge strani v zavihku, da sem hitro naložil.
Poglejmo si danes podrobneje!! Koda je bila najprej testirana:
Koda Homeview:
Koda krmilnika:
Za analizo testne kode ima naš krmilnik 3 metode, ena je domača stran, drugi dve pa testni metodi
Zahtevek Test1 blokira za 5 sekund in nato uporabniku vrne podatke
Test2 zahtevki ne blokirajo in bodo podatke neposredno vrnili uporabniku
Naša domača stran ima dva vmesnika za Ajax zahteve, ki so asinhrone zahteve, zato ni težav z blokiranjem.
Ugotovili bomo, da metoda Test1 izpiše vsebino šele potem, ko Test2 izpiše vsebino (Običajno stran neposredno izpiše vsebino, ki jo vrne Test2, nato pa počaka 5 sekund, da izpiše vsebino, ki jo vrne Test1, ker js ne blokira)
Nato neposredno dostopamo do vmesnikov Test1 in Test2, najprej do Test1, nato takoj do Test2 in ugotovimo, da mora Test2 počakati, da se Test1 vrne za dokončanje, kot je prikazano na spodnji sliki:
Če zahteva za stran nastavi zaklep bralnika, druge zahteve, ki se obdelujejo istočasno v isti seji, ne bodo mogle posodobiti stanja seje, vendar jih je vsaj mogoče prebrati. Če stran zahteva zaklepanje za pisanje v stanju seje, so vse druge strani blokirane, ne glede na to, ali želijo brati ali pisati vsebino. Na primer, če dva pogleda programa pišeta vsebino v isti seji hkrati, mora en program počakati, da je drugi končan, preden ga lahko napiše. Pri programiranju AJAX je pomembno, da se tega zavedamo.
Posebna opomba: Zahtevo Asp.net blokira le pri pisanju seje, vendar dokler ste obiskali stran, kjer je seja zapisana, na primer operacija po prijavi v sistem s sejo (seja je seveda zaklenjena do njenega poteka, le če je SessionID enak). Pojavil se bo ta problem.
Informacije o spletu
Dokler spletna stran uporablja sejo, bo vsaka zahteva sejo zaklenila skozi celotno življenjsko dobo, tako da morajo zahteve z istim sessionid počakati na odklepanje
To pomeni, da če ima spletna stran stran s časovnim iztekom, ne more ničesar storiti in morate počakati, da se časovno omejena stran naloži.
Tudi tega ne moreš narediti, več ajax sočasnih zahtev na isti strani, ne moreš, zahteve za anketiranje sporočil.
Če povzamem:Če vzamete sejo na zahtevo, če ne sprožite seje na zahtevo, zgornja situacija ne bo
Rešitev:
Dodana funkcija SessionState(System.Web.SessionState.SessionState.ReadOnly) v krmilnik krmilnika
Opomba:
Zahtevano pomeni, da zahtevate ekskluzivno zaklepanje seje (tj. brez vzporednega obdelovanja zahtevkov za isti sessionID) ReadOnly pomeni, da zahtevate neekskluzivno zaklepanje seje (tj. vaša zahteva mora še vedno počakati, da se zahteve z ekskluzivno zaklepanostjo zaključijo, vendar lahko obdelujete zahteve z neekskluzivno ključavnice vzporedno. Vendar pa je na vas, da zagotovite, da vaša koda ne piše v Session. To ni nujno zagotovljeno s strani okvira) Zahtevano pomeni mutex seje, ki ste jo zahtevali (tj. ni potrebe po obdelavi istega SessionID vzporedno)
ReadOnly pomeni, da je seja, ki jo zahtevate, neekskluzivna zaklep (tj. vaša zahteva mora še vedno počakati na dokončanje, zahteva za ekskluzivno zaklepanje, vendar lahko obdelavo obdelate z vzporedno neekskluzivno zaklepatvijo). Ampak želiš biti prepričan, da tvoja koda ne piše sej. Ni nujno, da ga izvaja ogrodje)
|