2013-04-02 18 views
9

sto simulando la cometa dal vivo protocollo di alimentazione per il mio sito, così nel mio controller Sto aggiungendoThread.sleep in asp.net

while(nothing_new && before_timeout){ 
    Thread.Sleep(1000); 
} 

ma ho notato tutto il sito ha ottenuto lento dopo ho aggiunto questo caratteristica. Dopo il debug, ho concluso che quando chiamo Thread.Sleep tutti i thread, anche in altre richieste, vengono bloccati.

Perché Thread.Sleep blocca tutti i thread, non solo la corrente e come gestire un problema come questo?

+1

Che cos'è il protocollo "cornet live feed" e dove possiamo trovare una documentazione su questo? –

+1

'Thread.Sleep' blocca solo il thread su cui è chiamato. Qualcos'altro deve andare avanti. –

+1

Le tue conclusioni non seguono logicamente dalle prove. –

risposta

21

Cosa @Servy ha detto è corretto. Oltre alla sua risposta vorrei buttare i miei 2 centesimi. Scommetto che stai usando sessioni ASP.NET e invii richieste parallele dalla stessa sessione (ad esempio stai inviando più richieste AJAX). Tranne che la sessione ASP.NET non è thread-safe e non è possibile avere richieste parallele dalla stessa sessione. ASP.NET serializzerà semplicemente le chiamate e le eseguirà in sequenza.

Ecco perché stai osservando questo blocco. Bloccherà solo le richieste dalla stessa sessione ASP.NET. Se si inviano richieste HTTP da una sessione diversa, questa non verrà bloccata. Questo comportamento è di progettazione e puoi leggere ulteriori informazioni su di esso here.

sessioni ASP.NET sono come un cancro e vi consiglio di loro disattivazione non appena si scopre che sono utilizzati in un'applicazione web:

<sessionState mode="Off" /> 

Non piú coda. Ora hai un'applicazione scalabile.

+0

corretto! tutti provengono dalla stessa sessione, tutti sono ajax! – Hilmi

+0

Yeap, lo sapevo. Questo è di design. –

+1

ok grazie mille signore, non so perché tutti iniziano ad attaccare questa domanda e votano, ma questa è la risposta che voglio! grazie ancora signore, – Hilmi

7

ho concluso che quando chiamo Thread.sleep tutti i fili anche in altre richieste vengono bloccati

Questa conclusione è corretto. Thread.Sleep non blocca nessun altro thread, blocca solo il thread corrente. Se più thread vengono bloccati da questa riga di codice, è perché tutti questi thread stanno colpendo questa riga di codice.

+0

scusa signore, la mia conclusione era corretta, mi sembra che l'asp blocca tutti i thread con la stessa sessione. – Hilmi

+2

@Hilmi No, la tua conclusione non era corretta. 'Thread.Sleep' non blocca altri thread, blocca solo un singolo thread. Tutti gli altri thread stavano bloccando perché stavano aspettando su questo thread, piuttosto che perché stavano eseguendo un comando di sospensione. È qualcosa di completamente diverso. – Servy

+0

davvero questo è il motivo per cui faccio la domanda, non pensi? – Hilmi