2009-06-30 17 views
53

Se si dispone di un'applicazione con solo pochi gestori di eventi registrati (e gli oggetti che utilizzano gli eventi non vengono eliminati fino alla chiusura dell'applicazione), devo veramente preoccuparmi di annullare la registrazione di questi gestori? L'unica buona ragione per cui ho potuto vedere è che potrebbe esserci un sovraccarico extra in caso di licenziamento di eventi di cui non ci si deve preoccupare (cioè si hanno più gestori registrati per un evento). C'è qualche altra buona ragione per? Chiunque si imbatte in problemi importanti perché non ha annullato la registrazione degli eventi?È sbagliato non annullare la registrazione dei gestori di eventi?

risposta

68

Se si dispone di A pubblicazione di un evento, e B la sottoscrizione di un evento (il gestore), allora è solo un problema di non annullare la sottoscrizione se A sta andando a vivere molto più a lungo di quanto B. Fondamentalmente, l'abbonamento all'evento significa che A può ancora vedere B, quindi impedirebbe che venisse raccolto dalla garbage collection e continuerebbe a generare eventi su di esso anche se l'hai dimenticato (e forse lo è Disposed()).

Ad esempio, questo è un problema se A è un evento statico, e la tua app funziona per un po 'dopo B muore ...

E' importante notare, ci si potrebbe chiedere quanto segue:

se B vive molto più a lungo di A, B eviterà A di essere raccolto?

E la risposta è "no". B non ha alcun riferimento ad A attraverso l'evento; A sarà raccolto come normale

+0

Questo è particolarmente grave se B è pesante in risorse ... –

+0

Grande intuizione Marc. i gestori di eventi statici sono davvero famosi se non vengono curati durante lo smaltimento dell'abbonato. – TheVillageIdiot

+3

So che questo è un vecchio post e non so se verrà mai letto, ma se B vive molto più a lungo di A, B conserverà A dall'essere spazzatura? –

14

Molte persone sembrano pensare che è importante solo annullare l'iscrizione agli eventi se l'editore sta per sopravvivere al sottoscrittore. Non mi piace questo approccio. Un sottoscrittore di eventi che non si distacca dall'editore crea alcune brutte dipendenze dal comportamento di entità esterne all'editore e al sottoscrittore. Se un riferimento all'editore viene mantenuto più a lungo del previsto, ciò manterrà vivo l'abbonato, insieme agli oggetti a cui l'abbonato detiene un riferimento. Se una grande massa di oggetti abbandonati sono interconnessi dai gestori di eventi, ma non esiste alcun riferimento attivo a nessuno di essi, tutti gli oggetti possono essere raccolti dal garbage collector. Se, tuttavia, qualcuno da qualche parte inaspettatamente mantiene un riferimento a uno degli oggetti, ciò potrebbe impedire che vengano raccolti insieme.

IMHO, è molto meglio essere proattivi nella rimozione di gestori di eventi piuttosto che abbandonarli e sperare che tutto venga ripulito. A meno che non si possa essere certi che non possano esistere riferimenti imprevisti all'editore, è probabile che un simile approccio funzioni "per lo più", ma causi occasionali perdite di memoria.

Problemi correlati