24

So che C# può gestire abbastanza bene le risorse con il proprio garbage collector. Ma dal momento che ha questo, cos'è esattamente questo e perché è necessario?Perché è necessario un metodo Dispose() esplicito in asp.net MVC Controller? Qualcuno può spiegare la sua complessità? (asp.net specifico)

Qualcuno può spiegare perché .Dispose() è necessario in asp.net mvc?

Inoltre, cosa significa eliminare una connessione? Perché è necessario? Qualcuno conosce la complessità del motivo per cui è importante disporre di una connessione al database come in db.Dispose()? Questo è correlato a EF o correlato a SQL Server? Sto cercando di capire esattamente perché.

protected override void Dispose(bool disposing) 
{ 
    db.Dispose(); 
    base.Dispose(disposing); 
} 
+2

In genere, se è un 'IDisposable', e stai tenendo a tutto ciò che è un 'IDisposable', fornire un metodo' Dispose'. E usalo. – cHao

+0

Ne ho sentito parlare ... ma esattamente perché? C# non ha un garbage collector che distrugge oggetti non necessari una volta che escono dall'ambito di applicazione? Quindi, perché esiste un metodo .Dispose() esplicito come in Controller per asp.net mvc? E anche su Entity Framework? Cosa fa esattamente? –

+0

possibile duplicato di [C# Finalize/Dispose pattern] (http://stackoverflow.com/questions/898828/c-sharp-finalize-dispose-pattern) Si prega di controllare le risposte principali per il tag IDisposable (non c'è nulla di specifico per MVC in utilizzo e implementazione di IDisposable). –

risposta

27

Dispose è per liberare risorse "non gestiti" (ad esempio, prese, handle di file, maniglie bitmap, ecc), e se è stato chiamato fuori un finalizzatore (che è quello che i disposing significa bandiera, btw), per disponendo altri oggetti idisposabili che ritiene non più utili.

Le risorse "non gestite" non sono gestite dal CLR (da cui il nome), e GC non ha problemi con loro o li libera da solo; in assenza del metodo Dispose (e del codice che lo sta effettivamente utilizzando!), si affiderà al finalizzatore dell'oggetto per ripulire. Alla fine il finalizzatore verrà eseguito (se l'app è integra e l'oggetto ha un finalizzatore) e se il finalizzatore fa il suo lavoro allora tutto è OK, ma ci vorrà del tempo per farlo - e se nel frattempo finisci le maniglie, vabbè. Peccato per quell'altro thread/processo/qualsiasi cosa ne avesse bisogno.

Se si Dispose, tuttavia, le risorse vengono rilasciate immediatamente e le cose funzionano meglio tutto intorno.

(A proposito, questo non è limitato a EF, SQL Server o qualsiasi altra tecnologia.Il modello usa e getta si trova in tutto il .net framework ed è considerato una buona pratica utilizzarlo ogni volta che si dispone di un IDisposable non è più in uso.)

Per quanto riguarda il motivo per cui lo IDisposable è stato implementato fino ad ora sull'albero, piuttosto che implementarlo caso per caso ... non sono sicuro al 100%. Ma immagina che stavi scrivendo un quadro. Considera che se tutto non fosse un IDisposable, dovresti controllare - ogni volta che volevi liberarti di qualcosa! - se l'oggetto è usa e getta, e in tal caso è Dispose. Se invece si implementa IDisposable "just in case", tuttavia, le cose sono semplificate: si elimina sempre. (Se un oggetto non ha nulla da pulire, semplicemente non sostituisce Dispose - nel qual caso viene chiamato il suo genitore Dispose e fa la pulizia, che può essere anche niente ...) Ed è un caso abbastanza comune per i controllori di avere cose da ripulire, che anche se questo non è il vero motivo, ha molto senso farlo comunque.

+3

Quali risorse non gestite vengono rilasciate dai controller ASP.NET MVC? –

+1

Dipende da cosa fanno e da come lo fanno. Non conosco l'interno di ASP.net MVC, ma immagino ci siano un sacco di handle di file coinvolti. Controller, possibilmente altri oggetti contenenti una connessione DB? Non so, non importa. Se ti stai aggrappando a tutto ciò che è identificabile, è buona educazione fornire un metodo 'Dispose' ... e per qualsiasi cosa stia trattenendo il tuo oggetto per chiamarlo. – cHao

Problemi correlati