2013-01-22 10 views
7

C'è un problema se mi iscrivo allo stesso evento tre volte con eventHandler? ad es.C# evento iscriversi e annullare l'iscrizione di duplicati

a.SomethingChanged += new EventHandler(ChangeHandler); 
a.SomethingChanged += new EventHandler(ChangeHandler); 
a.SomethingChanged += new EventHandler(ChangeHandler); 

Fa sì che ChangeHandler venga richiamato 3 volte anziché 1? Qual è il modo migliore per gestire questo?

Si noti che queste ridondanze non sono insieme, ma aree diverse di percorsi di codice.

Similari, c'è un problema con l'annullamento dell'iscrizione da un evento che non è registrato? ad es.

a.SomethingChanged -= new EventHandler(ChangeHandler); //ChangeHandler was never registered 
+0

Vedere questa domanda: http://stackoverflow.com/questions/817592/avoid-duplicate-event-subscriptions-in-c-sharp, in pratica, sì, ma è possibile evitarlo. – Sean

+1

provalo e guarda cosa succede! Sono curioso però, qual è l'idea che sta dietro ad avere percorsi di esecuzione esclusivi quando lo stesso risultato è incluso in ognuno di essi? –

+0

quindi in pratica non vi è alcun effetto collaterale di annullamento dell'iscrizione (- =) se non è già registrato. Corretta? – user236215

risposta

12

Se si sottoscrive un evento più di una volta allora il vostro gestore viene richiamato il corrispondente numero di volte - nel tuo esempio tre.

Se questo è un problema o meno dipende da ciò che fa il gestore di eventi, ma suppongo che tu non voglia che venga chiamato più volte.

Non c'è alcun problema nell'annullamento dell'iscrizione da un evento a cui non ti sei abbonato.

Quindi, se non siete sicuri di quale stato l'applicazione è in (anche se si dovrebbe davvero essere) si può avere:

a.SomethingChanged -= ChangeHandler; 
... 
a.SomethingChanged += ChangeHandler; 

(Nota: il new EventHandler(...) è zucchero sintattico e può essere omesso)

+0

Bene, potrebbe essere o non essere un problema iscriversi a un evento più di una volta. È possibile * volere * far attivare il gestore eventi più volte. – Servy

+0

@Servy: in senso stretto hai ragione, ma non è questa l'intenzione della domanda. – ChrisF

+0

perfetto, grazie! – user236215

4

C'è un problema se mi iscrivo allo stesso evento tre volte con eventHandler?

No, aggiungerà il gestore eventi tre volte.

Fa sì che ChangeHandler venga richiamato 3 volte anziché 1?

Sì.

Qual è il modo migliore per gestire questo?

Dipende da ciò che si desidera; che non hai specificato. Se si desidera un modo per aggiungere un gestore di eventi se e solo se non è già stato aggiunto, poi basta rimuovere il gestore di eventi e quindi aggiungere di nuovo:

a.SomethingChanged -= new EventHandler(ChangeHandler); 
a.SomethingChanged += new EventHandler(ChangeHandler); 

C'è un problema con cancellarsi da un evento che non è registrato?

No, non farà nulla.

Problemi correlati