none
Eventi in c#

    Domanda

  • per motivi vari in azienda siamo passati da vb.net a c#
    sviluppo un applicazione per palmare wince 5
    per cui risorse ridotte non vorrei trascinarmi in memoria più del dovuto

    quando sottoscrivo un evento in una form

    this.MenuBar.Click += new EventHandler(MenuBar_Click);

    prima di chiudere la form devo cancellarlo con -= ?
    esattamnete come si può fare ?

    mi sembra di aver letto da qualche parte che se non eseguo -=
    il garbage collector non distrugge la form

    grazie in anticipo
    Flavio


    sabato 29 maggio 2010 13:42

Risposte

  • la teoria dice di no:
     
    - MenuBar è un component;
    - MenuBar dovrebbe stare nella lista dei component della Form;
    - al Dispose della Form la Form fa il Dispose della lista dei
    component;
    - un component, se è scritto come si deve, ha una EventHandlerLits;
    - un component al Dispose fa la Dispose della EventHandlerList e tutti
    gli handler vengono implicitamente sganciati;
     
    In teora ;-)
     
    ..m
     
     
     

    Mauro Servienti
    {C67C0157-5D98-4733-A75E-93CAEE4BADC8}
    Microsoft MVP - Visual C# / MCP
    http://mvp.support.microsoft.com
    http://blogs.ugidotnet.org/topics
    whynot [ at ] topics [ dot ] it
    domenica 30 maggio 2010 10:20

Tutte le risposte

  • la teoria dice di no:
     
    - MenuBar è un component;
    - MenuBar dovrebbe stare nella lista dei component della Form;
    - al Dispose della Form la Form fa il Dispose della lista dei
    component;
    - un component, se è scritto come si deve, ha una EventHandlerLits;
    - un component al Dispose fa la Dispose della EventHandlerList e tutti
    gli handler vengono implicitamente sganciati;
     
    In teora ;-)
     
    ..m
     
     
     

    Mauro Servienti
    {C67C0157-5D98-4733-A75E-93CAEE4BADC8}
    Microsoft MVP - Visual C# / MCP
    http://mvp.support.microsoft.com
    http://blogs.ugidotnet.org/topics
    whynot [ at ] topics [ dot ] it
    domenica 30 maggio 2010 10:20
  • dopo varie ricerche e prove di implementazione

    non sono riuscito a trovare una soluzione "pulita"

    se mi potresti suggerire qualche link/soluzione/semplice

    grazie

    Flavio

     

    giovedì 10 giugno 2010 08:45
  • Ciao,
     
    non ho capito quale sia il problema, cioè se non trovi una soluzione
    semplice per liberare le risorse in fase d'uso o se tu stai scrivendo
    un controllo e quindi devi capire come incastrarti in questo meccanismo
    di liberazione delle risorse.
     
    ..m
     
     
     

    Mauro Servienti
    {C67C0157-5D98-4733-A75E-93CAEE4BADC8}
    Microsoft MVP - Visual C# / MCP
    http://mvp.support.microsoft.com
    blog @ http://milestone.topics.it
    whynot [ at ] topics [ dot ] it
    lunedì 14 giugno 2010 06:34
  • l'uno e l'altro

    per quanto riguarda la liberazione di risorse ho implementato l'interfaccia IDisposable

    e fin qui tutto OK

    ma non ho ben capito

    se ad ogni evento devo implementare l'add ed il remove per aggiungere ed eliminare l'evento dalla lista di che tipo base ???

    inoltre non ho ben capito se sia possibile ottenere l'elenco dei sottoscrittori ad un evento con getinvocationlist() potendoli coì semplicemente eliminare con un while(mousedown.getinvocationlist().count >0) this.mousedown -= this.mousedown.getinvocationlist(0);

    o cosa altro ?

    grazie

    Flavio

     

    sabato 19 giugno 2010 14:19
  • Ciao,
     
    parto da fondo, per sganciare tutti i subscriber ti basta:
     
    this.MyEvent = null;
     
    mentre ha senso implementare l'add/remove per centralizzare il tutto,
    ad esempio così:
     
    namespace MyNamespace
    {
    public class Entity : IDisposable
    {
    ~Entity()
    {
    this.Dispose( false );
    }
     
    protected virtual void Dispose( Boolean disposing )
    {
    if( disposing )
    {
    if( this._events != null )
    {
    this.Events.Dispose();
    }
    }
     
    this._events = null;
    }
     
    public void Dispose()
    {
    this.Dispose( true );
    GC.SuppressFinalize( this );
    }
     
    private EventHandlerList _events;
    protected EventHandlerList Events
    {
    get
    {
    if( this._events == null )
    {
    this._events = new EventHandlerList();
    }
     
    return this._events;
    }
    }
     
    private static readonly Object myEventKey = new Object();
    public event EventHandler MyEvent
    {
    add { this.Events.AddHandler( myEventKey, value ); }
    remove { this.Events.RemoveHandler( myEventKey, value ); }
    }
    }
    }
     
    liberamente tratto da "me stesso": http://radical.codeplex.com
     
    ..m
     
     
     

    Mauro Servienti
    {C67C0157-5D98-4733-A75E-93CAEE4BADC8}
    Microsoft MVP - Visual C# / MCP
    http://mvp.support.microsoft.com
    blog @ http://milestone.topics.it
    whynot [ at ] topics [ dot ] it
    domenica 20 giugno 2010 16:38
  • Anche se dire grazie è poco !!!

    Grazie

    Saluti

    Flavio

     

    domenica 27 giugno 2010 10:46
  • grazie a te per il feedback :-)
     
    ..m
     
     
     

    Mauro Servienti
    {C67C0157-5D98-4733-A75E-93CAEE4BADC8}
    Microsoft MVP - Visual C# / MCTS
    http://mvp.support.microsoft.com
    blog @ http://milestone.topics.it
    whynot [ at ] topics [ dot ] it
    domenica 27 giugno 2010 10:57