Nota: ricordarsi di deregistrare gli eventi... è importante!

Deregistrare un evento è una pratica poco pubblicizzata nonostante in alcune applicazione non farlo  provoca l'esaurimento di tutte le risorse disponibili.

E' sufficente che una applicazione crei molte istanze di oggetti utilizzati per un tempo limitato durante il quale si registrano ad un evento.
L'evento mantiene un riferimento ad ogni istanza e impedisce che venga rilasciata anche quando nella applicazione non c'è più nemmeno un solo riferimento a quella istanza.

Tulle le risorse in ogni istanza (es. connesioni al db, thread fisici, memoria managed o unmanaged, file aperti in modo esclusivo, etc) restano allocate e inutilizzabili sino a quando l'evento stesso viene rilasciato (cioè quando l'oggetto che lo espone viene rilasciato) .

Okkio : nemmeno FxCop o l'Analyze del codice di Visual Studio segnala questa dimenticanza, si scopre solo monitorando le risorse (memoria, connessioni, thread fisici, etc.)

Print | posted @ Saturday, May 3, 2008 12:06 AM

Comments on this entry:

Gravatar # re: Nota: ricordarsi di deregistrare gli eventi... è importante!
by LudovicoVan at 5/3/2008 12:56 PM

Giusto per segnalare che lo stesso avviene con JavaScript client-side nel browser.

In quel caso il problema puo' rivelarsi insidioso perche', per via delle closures, ecc., non e' sempre facile individuarlo nel codice.

Bottom line: Il "rilascio", anche nel contesto client-side, si risolve assegnando null agli oggetti "complessi" dopo il loro uso; l'effetto e' paragonabile a Dispose nel mondo managed.

BTW, A questo problema si aggiungono gli eventuali leak nel browser stesso, che magari non riesce a fare garbage collection al cambio di pagina. La somma di queste difficolta' sta alla base, per esempio, di alcuni problemi recenti con IE7 e i vari memory leak, e di tutta la confusione che ne e' seguita; tant'e' che il leak in questione pare fosse facilmente riproducibile su pagine che usano Ajax...

-LV
Gravatar # re: Nota: ricordarsi di deregistrare gli eventi... è importante!
by LudovicoVan at 5/3/2008 4:05 PM

P.S.

> si risolve assegnando null agli oggetti "complessi" dopo il loro uso; l'effetto e' paragonabile a Dispose nel mondo managed.

Da non prendere alla lettera perche' in effetti con JavaScript sono le "foglie" a dover essere rilasciate, cioe' non c'e' ricorsione come in un Dispose.

Forse li avrei dovuti chiamare "oggetti pesanti".

Spero di non aver aggiunto confusione... ;)

-LV
Comments have been closed on this topic.