Recentemente, quando lavoravo a un progetto, alcune pagine dovevano caricare molti dati e a volte cliccavo sulla pagina senza aspettare che finisse di caricarsi, per poi cliccare di nuovo su un'altra pagina
Ci sarà uno stato molto lento di animazione sospesa durante il caricamento della pagina web, quindi oggi studiamolo attentamente.
All'inizio pensavo che questa situazione si sarebbe verificata su molti siti web o che il problema di velocità della rete del mio computer, ma ho scoperto che questo sito non aveva questa situazione, a volte mi bloccavo quando pubblicavo, ma cliccavo su altre pagine della scheda per caricarle rapidamente.
Diamo un'occhiata più da vicino oggi!! Il codice testato per primo:
Codice Homeview:
Codice Controller:
Per l'analisi del codice di test, il nostro controller ha 3 metodi: uno è la home page e gli altri due sono metodi di test
La richiesta Test1 blocca per 5 secondi e poi restituisce i dati all'utente
Le richieste Test2 non bloccheranno e restituiranno i dati direttamente all'utente
La nostra homepage è composta da due interfacce per le richieste Ajax, che sono richieste asincrone, quindi non ci sono problemi di blocco.
Scopriremo che il metodo Test1 produce contenuti solo dopo che Test2 produce contenuti (Normalmente, la pagina genera direttamente il contenuto restituito da Test2, e poi aspetta 5 secondi per restituire il contenuto restituito da Test1, perché js non blocca)
Poi, accediamo direttamente alle interfacce Test1 e Test2, accediamo prima a Test1, e poi immediatamente a Test2, e scopriamo che Test2 deve aspettare che Test1 torni per completarsi, come mostrato nella figura sottostante:
Se una richiesta di pagina imposta un blocco lettore, altre richieste che vengono elaborate contemporaneamente nella stessa sessione non potranno aggiornare lo stato della sessione, ma almeno potranno essere lette. Se una pagina richiede un blocco di scrittura per lo stato della sessione, allora tutte le altre pagine vengono bloccate, indipendentemente dal fatto che vogliano leggere o scrivere contenuti. Ad esempio, se due visualizzazioni di programma stanno scrivendo contenuti nella stessa sessione contemporaneamente, un programma deve aspettare che l'altro sia finito prima di poter essere scritto. Nella programmazione AJAX è importante essere consapevoli di ciò che accade.
Nota speciale: solo quando scrivi una sessione, Asp.net bloccherà la richiesta, ma purché tu abbia visitato la pagina in cui la sessione è scritta, come l'operazione dopo aver effettuato il login al sistema con la sessione (la sessione è bloccata fino alla scadenza, ovviamente, è solo il caso in cui l'ID della sessione sia lo stesso). Ci sarà questo problema.
Informazioni sui netizen
Finché il sito utilizza una sessione, ogni richiesta bloccherà la sessione per tutta la sua durata, quindi le richieste con lo stesso sessionid devono attendere di essere sbloccate
Questo significa che se il sito ha una pagina con timeout, non può fare nulla e devi aspettare che la pagina timeout si carichi.
Neanche tu puoi farlo, più richieste ajax contemporanee sulla stessa pagina, non puoi farlo, richieste di interrogazione dei messaggi.
Per riassumere:Se prendi una sessione alla richiesta, se non porti una sessione alla richiesta, la situazione sopra non si verificherà
Soluzione:
Aggiunta la funzione SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly) al controller
Nota:
Obbligatorio significa che stai richiedendo un blocco esclusivo sulla sessione (cioè nessun trattamento parallelo delle richieste per lo stesso sessionID) ReadOnly significa che stai richiedendo un blocco non esclusivo su Session (cioè la tua richiesta deve comunque aspettare che le richieste con blocco esclusivo finiscano, ma puoi processare richieste con blocco non esclusivo serrature in parallelo. Tuttavia, sta a te assicurarti che il tuo codice non scriva su Session. Non è necessariamente imposto dal framework) Obbligatorio significa il mutex della sessione che hai richiesto (cioè non è obbligatorio elaborare lo stesso SessionID in parallelo)
ReadOnly significa che la sessione che richiedi è un blocco non esclusivo (cioè la tua richiesta deve comunque attendere il completamento, la richiesta di un blocco esclusivo, ma puoi elaborare una richiesta con un blocco parallelo non esclusivo). Ma devi assicurarti che il tuo codice non scriva sessioni. Non deve necessariamente essere eseguito dal framework)
|