Newsgroup: it.comp.dotnet
Titolo: [VB.NET] notifica stile callback ad un istanza di oggetto-classe dell'avvenuta o in corso distruzione

Salve ... sicuramente è roba trita e ritrita, ma sono duro 
alla logica del GC.
 
In una classe ho un contatore univoco "ID" di istanza, 
generato ad ogni NEW in modo banale (incrementando di uno 
una variabile statica, o SHARED per dirla alla VB).
Esiste anche una factory shared, che attinge allo stesso 
contatore shared, per cui di fatto è garantito che ogni 
oggetto, temporaneo o meno, abbia il suo ID univoco.
 
Ora io voglio redistrare in un dizionario quel benedetto 
"ID" univoco e usarlo come chiave per recuperare le istanze 
in modo ultra fast senza navigare o frugare (dimenticavo, la 
struttura è un grafo molti-a-molti, percorribile sia in 
discesa che in salita).
 
Il problema che mi sto ponendo è : se ogni tanto si generano 
dei temporanei, o se cmq deliberatamente dei nodi si 
cancellano, dovrei localizzare un punto del codice dove 
poter intercettare l'azione prima che venga fatta qualsiasi 
manovra, per valutare se 1) riallacciare i puntatori 
scavalcando il nodo rimosso e 2) togliere il suo ID dal 
dizionario per non rischiare di ottenere una reference ad 
istanza diventata inesistente.
 
Insomma, mi farebbe comodo quel che per i vecchi form erano
form_unload, o qualche routine tipo "on_dispose", che però 
venga chiamata piuttosto presto, quando i puntatori sono 
ancora consistenti.
 
Avrei bisogno di qualche dritta su come capire quando viene 
chiamato e quando il garbage collector si accinge a 
cancellare dei dati.
Anzi ... a dirla tutta a me non interessa capire quando 
FISICAMENTE lui evada la pratica, ma semplicemente quando 
firma la condanna da eseguire poi magari dopo con calma.
Io vorrei che prima di firmare mi facesse un fischio, in 
modo da poter gestire le pratiche in sospeso.
 
grazie in anticipo
Soviet
 
 
 

 gestire le pratiche in sospeso.
 
Potresti implementare IDisposable sui tuoi "nodi".  Implementato da manuale 
(vedi documentazione), hai garanzia che il Dispose venga invocato prima del 
rilascio dell'oggetto, e da li' puoi fare piu' o meno quello che vuoi...
 
-LV
 

 nebuloso, tipico di quando non si conosce l'argomento
 
E' nel metodo Dispose (in particolare nel Dispose(Boolean), come da link 
riportati sotto) che implementi la logica che ti serve: magari invochi un 
delegate, oppure sollevi un evento.  Il secondo esempio nel primo link 
mostra un accesso diretto ad una List<T>, ma ovviamente ci puoi costruire 
sopra.  Il secondo link contiene un approfondimento.  Per le informazioni di 
base ti consiglio un giro su MSDN partendo da IDisposable Interface.
 
http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx
 
http://www.bluebytesoftware.com/blog/2005/04/08/DGUpdateDisposeFinalizationAndResourceManagement.aspx
 
 
Tutto cio' detto, e' difficile darti indicazioni piu' precise, lo scenario 
che hai delineato e' alquanto generico/astratto e conoscendo piu' 
strettamente i tuoi requisiti magari si puo' fare di meglio: ti ho suggerito 
il pattern IDisposable solo perche' e' quello che nel framework piu' si 
avvicina ad una idea di clean-up.
 
-LV
 
 

 un oggetto rimane in vita.
 
Si', ma non e' un problema qui perche' stiamo parlando di implementare 
IDisposable, che e' deterministica (ovvero avviene esattamente quando il 
codice client la invoca), non stiamo parlando di implementare un finalizer.
 
Comunque, primo gentilmente guardati i link e la documentazione, altrimenti 
non vale la pena continuare a discutere.  Secondo, a meno che non ci dici 
quali sono i tuoi requisiti un po' piu' strettamente, temo che non ci sia 
gran che da aggiungere.
 
-LV