37 votes

Comment désenregistrer un gestionnaire d'événements 'anonymous'

Dites si j'écoute pour un événement:

 Subject.NewEvent += delegate(object sender, NewEventArgs e)
{
    //some code
});
 

Maintenant, comment désinscrire cet événement? Ou simplement laisser la mémoire couler?

42voto

dtb Points 104373

Donnez à votre instance du délégué anonyme un nom:

 EventHandler<NewEventArg> handler = delegate(object sender, NewEventArgs e)
{
    //some code
};

Subject.NewEvent += handler;
Subject.NewEvent -= handler;
 

24voto

Reed Copsey Points 315315

Si vous devez annuler l'enregistrement d'un événement, je vous recommande d'éviter les délégués anonymes pour le gestionnaire d'événements.

C’est un cas dans lequel l’affectation de cette méthode à une méthode locale est préférable: vous pouvez vous désabonner proprement de l’événement.

21voto

Ian Points 216

Pour supprimer le gestionnaire lors de la première invocation:

 //SubjectType Subject = ..... already defined if using (2)

EventHandler handler = null;
handler = delegate(object sender, EventArgs e)
{
    // (1)
    (sender as SubjectType).NewEvent -= handler;
    // or
    // (2) Subject.NewEvent -= handler;

    // do stuff here
};

Subject.NewEvent += handler;
 

6voto

EKazakov Points 68

Vous pouvez créer une méthode de désinscription de tous les écouteurs d'événement. Ce n'est pas exactement ce que vous voulez, mais parfois cela peut être utile. Par exemple (ça marche vraiment =)):

     class Program {
    static void Main(string[] args) {
        A someClass = new A();
        someClass.SomeEvent += delegate(object sender, EventArgs e) {
            throw new NotImplementedException();
        };

        someClass.ClearEventHandlers();
        someClass.FireEvent();

        Console.WriteLine("No error.");
    }

    public class A {
        public event EventHandler SomeEvent;

        public void ClearEventHandlers() {
            Delegate[] delegates = SomeEvent.GetInvocationList();
            foreach (Delegate delegate in delegates) {
                SomeEvent -= (EventHandler) delegate;
            }
        }

        public void FireEvent() {
            if (SomeEvent != null) {
                SomeEvent(null, null);
            }
        }
    }
}
 

2voto

apiguy Points 3031

Vous avez besoin d'un nom pour votre fonction anonyme et vous ne pouvez le faire que tant que le nom est dans la portée:

     var handler = new EventHandler(delegate(object o, EventArgs e)
    {
        //do something...
    };

    Subject.NewEvent += handler;

    // later on while handler is still in scope...

    Subject.NewEvent -= handler;
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X