2009-01-31 35 views
7

In ASP.NET se gli elementi vengono lasciati nello stato di sessione che Implement IDisposable ma non vengono mai specificamente rimossi e eliminati dall'applicazione quando la sessione scade sarà Dispose essere richiamato sugli oggetti che qualsiasi codice in Dipose () verrà eseguito?Sessione contenente elementi che implementano IDisposable

+0

Altre risposte a questa domanda: http://stackoverflow.com/q/12347044/11683 – GSerg

risposta

2

Se il modello IDisposable è implemented properly, allora sì (vale a dire che il distruttore della classe si occuperà di smaltire l'oggetto). Non credo che il gestore di sessione ASP.NET abbia garanzie circa la chiamata esplicita Dispose() alle classi che implementano IDisposable.

Nota che nonostante le obiezioni aggressive di Mark, non sto suggerendo di aggiungere "regolarmente" i finalizzatori. Sto semplicemente suggerendo che se si vuole il metodo Dispose sul tuo oggetto chiamato quando scade la sessione, questa è una valida opzione.

+2

Un finalizzatore è * non * un'implementazione corretta IDisposable; piuttosto, qualcosa con un finalizzatore può spesso anche essere IDisposable. Ma un oggetto IDisposable non dovrebbe avere un finalizzatore solo perché è IDisposable. –

+0

Non pensavo che fosse "aggressivo" - semplicemente che un finalizzatore non ha nulla a che fare se IDisposable è "implementato correttamente" –

+0

Direi di lasciare un commento negativo sulla mia risposta, travisare la mia risposta e creare la tua risposta che ribadisce che il tuo disaccordo si qualifica come "un'obiezione aggressiva". Ognuno di questi sarebbe stato sufficiente in sé e per sé. Immagino che non dovremo essere d'accordo anche su questo. –

10

Non sarei d'accordo con la risposta di Sean; in primo luogo, i finalizzatori dovrebbero non essere aggiunti di routine alle classi, anche se sono IDisposable - i finalizzatori devono essere utilizzati solo in classi che rappresentano risorse non gestite. Viceversa, una classe con un finalizzatore spesso è anche IDisposable.

Re la domanda: è Dispose() chiamato - no, non lo è. L'oggetto sarà garbage collection in futuro (indeterminato), ma questo è tutto. Un finalizzatore non aggiungerebbe molto qui, dal momento che tutti gli oggetti incapsulati saranno già idonei per la raccolta (supponendo che non vengano citati altrove).

1

Sarei preoccupato di avere oggetti usa e getta in sessione. Creerà quasi sicuramente un problema di scalabilità per te. Tutto ciò che è Usa e getta è probabilmente connesso ad alcune risorse limitate, se hai molte sessioni attive probabilmente utilizzerai quella risorsa. In secondo luogo, mi aspetto che molti (la maggior parte?) Oggetti usa e getta non funzionino bene in una web farm poiché la risorsa a cui sono legati è probabilmente locale a una singola macchina e non serializzeranno e quindi deserializzeranno su un'altra macchina nella stessa stato.

Problemi correlati