GC

venerdì 28 luglio 2006 - 10.12

trinity Profilo | Guru

Ragazzi una piccola delucidazione...
Il GC permette di rilasciare la memoria, vero?
Mentre il metodo dispose permette di rilasciare le risorse dell'oggetto, vero?

Allora il metodo dispose posso richiamarlo da codice ed è consigliato farlo?

Secondo, quando creo una windowsApplication il GC viene gestito in automatico da framework permettendo alla chiusura delle form e successivamente dell'applicazione stessa il rilascio della memoria? Oppure vi è un determinato codice per gestire ed attivare il GC in una WindowsApplication?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alextyx Profilo | Expert

Proprio stamani stavo leggendo, durante la mia pausa culturale (in bagno!), l'uso del metodo dispose e della sua possibile alternativa 'using' (solo VB2005).
In pratica la raccomandazione è di chiamare il metodo dispose esplicitamente( direttamente oppure mediante la chiamata al metodo 'close' se disponibile), ogni volta che un oggetto che utilizzi risorse diverse dalla sola memoria, non serve più.
Es.:

Dim F1 as new Form1
'...lo uso
F1.close 'Chiamo comunque dispose anche se attraverso il close

La chiamata al metodo dispose è talmente importante che si può scegliere di effettuarla in un 'Finally' di un blocco Try ... End Try, così che anche di fronte ad un errore non ci siano rischi di lasciare impegnate le risorse.

Il GC può e in alcuni casi 'deve' essere chiamato all'opera con: GC.Collect
Ho visto problemi con applicazioni video dove se non toglievi di mezzo l'oggetto con GC.Collect e GC.WaitForPending...(non ricordo bene l'istruzione ), che serve ad attendere la fine del lavoro del GC (che opera su un proprio thread) prima di proseguire, ti potevi scordare di vederle girare.
In generale, comunque, contrariamente al dispose, il GC opera per conto proprio e se non strettamente necessario, va lasciato fare di testa sua!

trinity Profilo | Guru

>Il GC può e in alcuni casi 'deve' essere chiamato all'opera con:
>GC.Collect
>Ho visto problemi con applicazioni video dove se non toglievi
>di mezzo l'oggetto con GC.Collect e GC.WaitForPending...(non
>ricordo bene l'istruzione ), che serve ad attendere la fine
>del lavoro del GC (che opera su un proprio thread) prima di proseguire,
>ti potevi scordare di vederle girare.
>In generale, comunque, contrariamente al dispose, il GC opera
>per conto proprio e se non strettamente necessario, va lasciato
>fare di testa sua!

Si ma dacome so il GC è sempre attivo con il framework e pertanto non mi servirebbe alcun codice oper gestirlo, o sbaglio? Comunque in programmi gestionali, per esempio, dove devo utilizzare dei thread per accedere e visualizzare successivamente i dati di un database, il rilascio della memoria e delle risorse(Dispose) è necessario. Allora il rilascio delle risorse lo faccio utilizzando il metodo dispose tipo nella chiusura della form oppure meglio ancora quando utilizzo l'oggetto SqlCommand, ecc...Mentre per il rilascio della memoria c'è il GC ma qualora servisse del codice per gestire lo stesso GC, il codice lo dovrei inserire alla fine del thread.

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alextyx Profilo | Expert

Veniam peto, pensavo stessimo parlando di VB!

trinity Profilo | Guru

sisi...il post che ho aperto riguarda vb.net
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alextyx Profilo | Expert

Beh...in VB lo trovi solo dalla versione 2005. Di C# so poco più di niente e mi affido in toto a quanto detto dall'amico Coach
Per quanto attiene alla gestione del GC, come già accennato, normalmente il GC fa corsa propria e si legge spesso di lasciarlo agire in automatico, per non introdurre lavoro inutile nell'applicazione. Comunque, talvolta, dolpo aver segnalato, mediante il disposing, che la 'vittima', chiunque essa sia, può essere preda del GC, può essere utile chiamare esplicitamente il processo di 'pulitura' da parte del GC. Se la tua applicazione può permettersi dei rallentamenti, puoi imporre tale processo. Come dicevo, talvolta è inutile, quasi sempre è poco utile, raramente è obbligatorio...ma in quel caso te ne accorgi da solo!

trinity Profilo | Guru

Quindi in conclusione mi dite che il GC è attivo in automatico su qualsiasi applicazione che realizzo da vbNet e non debbo utilizzare nessun codice di programmazione per gestirlo...inoltre io a seconda degli oggetti che lo posseggono utilizzo il metodo dispose per rilasciare le risorse, giusto?

Ciao e grazie per l'info
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alextyx Profilo | Expert

Di base sì, sempre tenendo conto che talvolta è il metodo close che ti fa il lavoro, come nel caso di una Form, però, in genere, un metodo dispose ben fatto ha un controllo interno per cui puoi richiamarlo più volte senza che ti spari errore e quindi puoi anche scrivere, impunemente:

Form1.Close
Form1.Dispose

Che comunque è un codice ridondante.
Però, se hanno messo la possibilità di imporre al GC di intervenire 'a comando', un motivo forse c'è e x quanto mi riguarda ho avuto modo di verificare casi in cui era 'necessario' chiamare un GC.Collect e fermarsi ad aspettare la fine del lavoro.
Comunque, questa storia della finalizzazione non deterministica, mi piace poco....ma ci si deve convivere per forza!
Per non sapere nè leggere, nè scrivere, comunque, se la tua applicazione ha dei momenti di lavoro meno intenso, io un bel GC.Collect glielo farei sparare, ma è un parere più 'a pelle' piuttosto che su basi tecniche, quindi prendilo x ciò che è! Ciao.

Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5