2013-10-11 3 views
3

Я новичок в C# .net; Я просто хотел узнать, может ли многократное приведение обработчика событий привести к неожиданному результату?Присоединение обработчика событий несколько раз

На самом деле в моем приложении я прилагаю обработчик события к событию, как

cr.ListControlPart.Grid.CurrentCellActivated += new EventHandler(Grid_CurrentCellActivated); 

и эта строка кода вызывается несколько раз в коде.

ответ

4

Если вы продолжаете прикреплять обработчики событий, то он будет поднят для каждого экземпляра. Если вам нужно, чтобы он был поднят один раз, назначьте один обработчик.

Посмотрите на свой код, вместо того, чтобы подключаться к событию CurrentCellActivated несколько раз, было бы разумнее подписаться на общее событие CellActivated.

+0

Это означает, что если обработчик событий подключен 10 раз, то всякий раз, когда событие возникает, обработчик получает 10 раз? – BhushanK

+0

@Bhushan точно. – James

+0

@ На самом деле, я играю с выпадающей сеткой ячейки сетки. и нет такого события, как «CellActivated». – BhushanK

13

Попробуйте сами:

static class Program 
{ 
    static event EventHandler MyEvent; 

    static void Main() 
    { 
     // registering event 
     MyEvent += Program_MyEvent; 
     MyEvent += Program_MyEvent; 
     MyEvent += Program_MyEvent; 
     MyEvent += Program_MyEvent; 
     MyEvent += Program_MyEvent; 

     // invoke event 
     MyEvent(null, EventArgs.Empty); 
     Console.ReadKey(); 
    } 

    static void Program_MyEvent(object sender, EventArgs e) 
    { 
     Console.WriteLine("MyEvent fired"); 
    } 
} 
+7

Вот ссылка, чтобы попробовать программу онлайн: https://dotnetfiddle.net/iW4eAN – Makotosan

5

Вы можете предотвратить его отпиской, прежде чем добавить,

Object.Event -= EventHandler(method); 
Object.Event += EventHandler(method); 

, если можно сделать, предотвратить его всегда подписываются события в одном месте говорят конструктор

+3

Что произойдет, когда мы попытаемся отказаться от обработчика событий в первый раз, когда он еще не подписан? – BhushanK

+2

@Bhushan Да, даже лучше всего отказаться от подписки на событие, когда оно не используется. GC Не собирает это немедленно –

+0

Этот подход работает, и при первой подписке никаких исключений не возникает. (т. е. = = молча игнорируется). –

Смежные вопросы