Neseniai, kai dirbau su projektu, kai kuriuose puslapiuose reikėjo įkelti daug duomenų, o kartais spustelėdavau puslapį nelaukdamas, kol puslapis baigs įkelti, o tada vėl spustelėdavau kitą puslapį
Įkeliant tinklalapį bus labai lėta sustabdytos animacijos būsena, todėl šiandien atidžiai išnagrinėkime.
Iš pradžių maniau, kad tokia situacija atsiras daugelyje svetainių arba mano kompiuterio tinklo greičio problema, tačiau pastebėjau, kad šioje svetainėje tokios situacijos nėra, kartais įstrigdavau, kai paskelbdavau, bet spustelėdavau kitus skirtuko puslapius, kad greitai įkelčiau.
Pažvelkime atidžiau šiandien! Pirmiausia išbandytas kodas:
Pagrindinis peržiūros kodas:
Kontrolieriaus kodas:
Bandymo kodo analizei mūsų valdiklis turi 3 metodus, vienas yra pagrindinis puslapis, o kiti du yra bandymo metodai
Test1 užklausa blokuojama 5 sekundėms ir grąžina duomenis vartotojui
Test2 užklausos nebus blokuojamos ir grąžins duomenis tiesiai vartotojui
Mūsų pagrindinis puslapis yra dvi sąsajos Ajax užklausoms, kurios yra asinchroninės užklausos, todėl nėra blokavimo problemos.
Pamatysime, kad Test1 metodas išveda turinį tik po to, kai Test2 išveda turinį (Paprastai puslapis tiesiogiai išves Test2 grąžintą turinį, o tada palaukite 5 sekundes, kol bus išvestas Test1 grąžintas turinys, nes js neblokuoja)
Tada mes tiesiogiai pasiekiame Test1 ir Test2 sąsajas, pirmiausia pasiekiame Test1, tada nedelsdami pasiekiame Test2 ir pastebime, kad Test2 turi palaukti, kol Test1 grįš baigti, kaip parodyta paveikslėlyje žemiau:
Jei puslapio užklausa nustato skaitytojo užraktą, kitos užklausos, kurios apdorojamos tuo pačiu metu tame pačiame seanse, negalės atnaujinti seanso būsenos, bet bent jau jas bus galima perskaityti. Jei puslapis prašo seanso būsenos rašymo užrakto, visi kiti puslapiai blokuojami, nepriklausomai nuo to, ar jie nori skaityti ar rašyti turinį. Pavyzdžiui, jei du programos rodiniai rašo turinį tame pačiame seanse tuo pačiu metu, viena programa turi palaukti, kol bus baigta kita programa, kad ją būtų galima parašyti. AJAX programavime svarbu žinoti, kad tai vyksta.
Speciali pastaba: tik rašydami sesiją Asp.net užblokuosite užklausą, bet tol, kol apsilankėte puslapyje, kuriame parašyta sesija, pvz., operacija prisijungus prie sistemos su sesija (sesija užrakinama iki jos galiojimo pabaigos, žinoma, tik tuo atveju, jei sesijos ID yra tas pats). Bus tokia problema.
Netizen informacija
Kol svetainė naudoja seansą, kiekviena užklausa užrakins seansą per visą jo gyvavimo laiką, todėl užklausos su tuo pačiu seanso ID turi palaukti, kol bus atrakintos
Tai reiškia, kad jei svetainėje yra skirtasis laikas, ji nieko negali padaryti ir turite palaukti, kol bus įkeltas laikas puslapis.
Jūs taip pat negalite to padaryti, keli ajax vienu metu užklausos tame pačiame puslapyje, jūs negalite to padaryti, pranešimų apklausos užklausos.
Apibendrinant:Jei į užklausą įtrauksite seansą, jei nepateiksite seanso į užklausą, aukščiau nurodyta situacija neįvyks
Sprendimas:
Įtraukta funkcija SessionState(System.Web.SessionState.SessionState.SessionStateBehavior.ReadOnly) prie valdiklio valdiklio
Nata:
Būtina reiškia, kad prašote išskirtinio seanso užrakto (t. y. lygiagrečiai neapdoroti to paties seanso ID užklausų) "ReadOnly" reiškia, kad prašote neišskirtinio "Session" užrakto (t. y. jūsų užklausa vis tiek turi palaukti, kol užklausos su išskirtiniu užraktu bus baigtos, tačiau galite apdoroti užklausas su neišskirtiniu spynos lygiagrečiai. Tačiau jūs turite užtikrinti, kad jūsų kodas nebūtų rašomas į "Session". Tai nebūtinai vykdoma pagal sistemą) Būtinas reiškia jūsų prašomą seanso muteksą (t. y. nereikalaujama lygiagrečiai apdoroti to paties SessionID)
"ReadOnly" reiškia, kad jūsų užklausa yra neišskirtinis užraktas (t. y. jūsų užklausa vis dar turi palaukti, kol bus užbaigta, išskirtinio užrakto užklausa, bet galite apdoroti užklausą naudodami lygiagrečią neišskirtinį užraktą). Tačiau norite įsitikinti, kad jūsų kodas nerašo seansų. Jis neturi būti vykdomas pagal sistemą)
|