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
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
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.
- 1. Controllo utente caricato dinamicamente con gestori di eventi - Annulla registrazione
- 2. Devo annullare l'iscrizione a tutti i gestori di eventi?
- 3. Come annullare la registrazione e registrare un gestore eventi attendibile?
- 4. Differenze nell'assegnazione dei gestori di eventi C#?
- 5. Rimozione gestori di eventi
- 6. Devo annullare la registrazione di "anonymous" BroadcastReceiver
- 7. Rimozione dei gestori dai logger di registrazione di Python
- 8. Quali sono i metodi migliori per registrare/annullare la registrazione dell'attività sul ciclo di eventi?
- 9. Come annullare l'indicatore getUserMedia dopo la registrazione
- 10. std :: funzione come richiamata, è possibile annullare la registrazione?
- 11. C# Come annullare l'iscrizione a tutti i gestori di eventi da un determinato evento?
- 12. C# gestori di eventi personalizzati
- 13. Android: Annullare la registrazione pulsante della fotocamera
- 14. Eventi di registrazione flurry non sempre
- 15. CIO: Cablaggio dipendenze da gestori di eventi
- 16. Qual è il modo corretto di annullare la registrazione dei callback del ciclo di vita delle attività?
- 17. Nome degli eventi e dei gestori C# correttamente
- 18. C# - funzioni anonime e gestori di eventi
- 19. gestori di segnale e la registrazione in Python
- 20. CA1009: dichiarare correttamente i gestori di eventi?
- 21. C#, gestori di eventi e Threading
- 22. jQuery vuoto funzione e gestori di eventi
- 23. I gestori di eventi non sono thread safe?
- 24. È sicuro utilizzare async/await nei gestori di eventi ASP.NET?
- 25. Differenza tra gestori di eventi e callback
- 26. Registrazione di gestori per evento COM .NET in C++
- 27. Quando annullare la registrazione di Broadcast Receiver registrato su onCreate?
- 28. Annullare la registrazione di una richiamata registrata tramite register_callback()?
- 29. Quando collegare i gestori di eventi asp.net
- 30. Registrazione eventi IP Address non sempre risolve
Questo è particolarmente grave se B è pesante in risorse ... –
Grande intuizione Marc. i gestori di eventi statici sono davvero famosi se non vengono curati durante lo smaltimento dell'abbonato. – TheVillageIdiot
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? –