2010-02-14 7 views
3

J'ai un code qui attache un événement à un formulaire.Un événement est-il exécuté deux fois si le rappel a été attribué deux fois à l'objet?

this.form.Resize += new EventHandler(form_Resize); 

Comme vous le voyez, cela est fait par +=. Si le code ci-dessus est exécuté deux fois ou plusieurs fois,

comme ceci:

this.form.Resize += new EventHandler(form_Resize); 
this.form.Resize += new EventHandler(form_Resize); 
this.form.Resize += new EventHandler(form_Resize); 
this.form.Resize += new EventHandler(form_Resize); 
this.form.Resize += new EventHandler(form_Resize); 

est la méthode de rappel associée à plusieurs reprises?

Combien de fois sera appelée la méthode form_Resize?

Un événement est-il exécuté plusieurs fois si sa méthode de rappel a été affectée plusieurs fois au même objet?

+0

L'avez-vous essayé? –

+0

Non, je ne le fais pas. Je pense que l'optimiseur verra ce front et ne s'attachera pas plusieurs fois. – Pentium10

Répondre

6

Le gestionnaire d'événements sera appelé une fois pour chaque fois qu'il est attaché. (C#)

Pour se prémunir contre double attachement, vous pouvez utiliser ce modèle:

this.form.Resize -= new EventHandler(form_Resize); 
this.form.Resize += new EventHandler(form_Resize); 

La première instruction ne jetterai pas une erreur s'il n'y a pas gestionnaires attachés et supprimer un gestionnaire existant.

+0

Dans votre exemple, vous créez deux instances différentes de 'EventHandler', ce qui ne vous empêcherait pas d'invoquer plusieurs fois. Vous devez créer le 'EventHandler' une fois et le stocker dans une variable locale pour que cela fonctionne ... –

+0

C'est incorrect. 'System.Delegate' remplace 'Equals'; Au code de suppression du gestionnaire d'événements, ces deux objets sont égaux, même s'il s'agit de deux instances différentes, et le gestionnaire d'événements est supprimé s'il était déjà présent. Voir http://msdn.microsoft.com/en-us/library/99bthb1z.aspx. –

2

Il sera en C# - je ne sais pas à propos de Java. Vous ajoutez plusieurs délégués à la même méthode et chacun sera appelé à son tour.

Voici un exemple rapide qui le prouve:

using System; 

class Example 
{ 
    static event Action Bar; 

    static void Main() 
    { 
     Bar += Foo; 
     Bar += Foo; 

     Bar(); 
    } 

    static void Foo() 
    { 
     Console.WriteLine("Foo"); 
    } 
} 
+0

Comment déterminer si un délégué a déjà été joint à l'événement, afin de ne pas le rattacher de nouveau? – Pentium10

+0

Vous devrez appeler 'GetInvocationList' sur l'événement et vérifier si le délégué a déjà été ajouté. Cela ne fonctionnera que dans le type qui possède le délégué, donc si vous ne possédez pas la source du type qui expose le délégué, vous ne pourrez pas le faire. –

+1

@ Pentium10: Comme Doug l'a mentionné, vous pouvez utiliser - = avant + = pour supprimer votre gestionnaire d'événements existant, s'il existe. –

0

Doublons sont autorisés dans la liste d'appel, donc oui, la méthode sera exécuté plusieurs fois. En C# au moins.

Questions connexes