2009-10-13 7 views
12

Quindi mi chiedo come esattamente asp.net sia in grado di analizzare una proprietà statica, quando (a mia conoscenza) asp.net è multi-thread.In che modo HttpContext.Current funziona in un ambiente con più thread?

  • Una teoria sostiene che i tipi di ASP.NET mantengono un appdominio diverso per ogni richiesta ... ma ciò non sembra fattibile.
  • Un'altra teoria sostiene che il metodo .Current esamina il thread corrente e quindi lo utilizza per cercare il contesto http in alcuni hashtable (o altri meccanismi di archiviazione statici).

In entrambi i casi, si tratta di una tecnica che sembra davvero utile ... mi piacerebbe utilizzarlo, ma sicuramente non voglio essere il debug bug stato condiviso: -/

risposta

8

Quello che Marc dice è il più facile per quello che si sta cercando, tuttavia ASP.NET è in realtà un po 'più complicato di quello che dice ThreadStatic, perché le singole richieste possono essere effettivamente elaborate da più thread .. quello che credo accade con ASP.NET dice che il thread in esecuzione viene esplicitamente detto di cambiare contesto, ovviamente l'ambiente di hosting sta pianificando i thread e ha un contesto di cui httpcontext ha bisogno di essere eseguito, quindi trova un thread, dice al thread in quale contesto deve essere eseguito. quindi lo invia per la sua strada.

Quindi la soluzione non è poi così triste, in cui il threadstatic è molto più semplice e probabilmente soddisfa il 95% delle volte.

15

Non è un AppDomain per richiesta. Se si desidera utilizzare uno specifico stato-thread, provare:

[ThreadStatic] 
private static int foo; 
public static int Foo {get {return foo;} set {foo = value;}} 

Ogni thread ora prende il proprio valore Foo (o meglio: 'foo').

Questo è non da utilizzare leggermente - ha dei costi, ma è un modo valido di condividere lo stato su una base per thread. L'ho usato una volta, forse due volte - e ho scritto un sacco di C#. Non over-usarlo ...

In particolare, attenzione per i problemi di inizializzazione (ad esempio dimenticando di farlo), e ricordarsi di pulire dopo te ecc Ed essere molto attenti se si utilizza qualsiasi asincrona codice, poiché ogni callback/worker/etc avrà uno stato differente.

+0

impressionante, grazie per questo ... l'istanza statica viene ripulita una volta che il thread muore? –

+3

Importante notare che ThreadStatic non è affidabile in uno scenario di carico elevato. ASP.NET cambia i contesti delle richieste tra i thread e migra HttpContext. Qualsiasi [ThreadStatic] verrà lasciato sul vecchio thread, che sta rilevando una nuova richiesta. –

+0

Interessante domanda ... soprattutto se si tratta di un thread di pool che potrebbe essere riutilizzato ;-p Il mio consiglio: pulire manualmente se si sta facendo questo tipo di cose. –

Problemi correlati