none
Dispose con Detach event handler RRS feed

  • Domanda

  • giorni fa ho chiesto il come mai di una istruzione tipo la seguente in seguito al gestore evento CollectionChanged di una observableCollection:

    (sender..e)

    {  workspace.RequestClose += new EventHandler(OnWorkspaceRequestClose);}

    E mi è stato detto che ciò è necessario affinchè l'oggetto possa essere davvero rimosso dalla memoria.

    Domanda:

    se io ho una classe (c1) che definisce un evento e da un'altra classe (c2) mi registro per tale evento, quando da c2 ho bisogno di disposare, o settare a null c1 (insomma quando nn ne ho piu bisogno), affinchè le risorse siano davvero liberate devo "detachare" il gestore evento come nell'esempio di sopra?

    venerdì 9 marzo 2012 07:19

Risposte

  • Ciao ifCodeIsTrue,

    You wrote on 09/03/2012 :

    se io ho una classe (c1) che definisce un evento e da un'altra classe (c2) mi registro per tale evento, quando da c2 ho bisogno di disposare, o settare a null c1 (insomma quando nn ne ho piu bisogno), affinchè le risorse siano davvero liberate devo "detachare" il gestore evento come nell'esempio di sopra?

    la risposta generica è si.

    Per fugare ogni dubbio il concetto è questo: Il garbage collector può fare il garbage di tutte le reference che non sono più usate da nessuno ergo se c1 ha in qualche modo una reference a c2 (ad esempio perchè ha un handler agganciato su un evento di c2) allroa il GC non le tocca e questo potrebbe essere un problema.

    hai quindi due scenari:

    * il dispose di c1 colui che usa l'evento: devi sganciare esplicitamente l'handler altrimenti rischi che c2 sopravviva e qui la tecnica è quella di cui sopra;

    * il dispose di c2 (colui che espone l'evento): devi esplicitamente sganciare tutti quelli che stanno usando i tuoi eventi, ma non sai chi sono, tecnicamente basta un this.MyEvent = null, ma se gli eventi sono tanti è una menata, in questo caso la manna è cambiare il pattern per esporre gli eventi e usare internamente una EventHandlerList per persistere tutti gli handler di tutti gli eventi.

    Se sei in wpf invece visto che il concetto di "IDisposable" è un po' obsolete (per tanti buoni motivi) ti consiglio di dare un occhio al concetto di weak event e all'interfaccia IWeakEventManager, un po' ostico all'inizio ma una volta che hai capito il giochetto risolvi tutti i problemi del caso.

    .m



    blog @ //milestone.topics.it
    • Contrassegnato come risposta ifCodeIsTrue venerdì 9 marzo 2012 08:25
    venerdì 9 marzo 2012 07:29

Tutte le risposte

  • Ciao ifCodeIsTrue,

    You wrote on 09/03/2012 :

    se io ho una classe (c1) che definisce un evento e da un'altra classe (c2) mi registro per tale evento, quando da c2 ho bisogno di disposare, o settare a null c1 (insomma quando nn ne ho piu bisogno), affinchè le risorse siano davvero liberate devo "detachare" il gestore evento come nell'esempio di sopra?

    la risposta generica è si.

    Per fugare ogni dubbio il concetto è questo: Il garbage collector può fare il garbage di tutte le reference che non sono più usate da nessuno ergo se c1 ha in qualche modo una reference a c2 (ad esempio perchè ha un handler agganciato su un evento di c2) allroa il GC non le tocca e questo potrebbe essere un problema.

    hai quindi due scenari:

    * il dispose di c1 colui che usa l'evento: devi sganciare esplicitamente l'handler altrimenti rischi che c2 sopravviva e qui la tecnica è quella di cui sopra;

    * il dispose di c2 (colui che espone l'evento): devi esplicitamente sganciare tutti quelli che stanno usando i tuoi eventi, ma non sai chi sono, tecnicamente basta un this.MyEvent = null, ma se gli eventi sono tanti è una menata, in questo caso la manna è cambiare il pattern per esporre gli eventi e usare internamente una EventHandlerList per persistere tutti gli handler di tutti gli eventi.

    Se sei in wpf invece visto che il concetto di "IDisposable" è un po' obsolete (per tanti buoni motivi) ti consiglio di dare un occhio al concetto di weak event e all'interfaccia IWeakEventManager, un po' ostico all'inizio ma una volta che hai capito il giochetto risolvi tutti i problemi del caso.

    .m



    blog @ //milestone.topics.it
    • Contrassegnato come risposta ifCodeIsTrue venerdì 9 marzo 2012 08:25
    venerdì 9 marzo 2012 07:29
  • ok grazie
    venerdì 9 marzo 2012 08:24