C # Знаете, сколько EventHandlers установлено? - PullRequest
12 голосов
/ 22 июня 2011

Как мы все знаем, мы можем создать EventHandler и добавлять методы к нему N раз. Как:

   // Declare and EventHandler     
   public event EventHandler InternetConnectionAvailableEvent;
    private void OnInternetConnectionAvailableEvent()
    {
        if (InternetConnectionAvailableEvent != null)
        {
            EventHandler handle = InternetConnectionAvailableEvent;

            EventArgs e = EventArgs.Empty;
            handle(this, e);
        }
    }


   // IN OTHER CLASS WHERE I USE THE EVENT
   // Set the method name to handle the event    
   monitorInternet.InternetConnectionAvailableEvent += HandleInternetConnectionEvent;

    void HandleInternetConnectionEvent(object sender, EventArgs e)
    {
        if (syncContext != null)
        {
            MonitorInternetConnection mic = (MonitorInternetConnection)sender;
            if (mic != null)
            {
                syncContext.Post(o => InternetConnected(), null);
            }
        }
    }

   // To remove
   monitorInternet.InternetConnectionAvailableEvent -= null; 

ОБНОВЛЕНИЕ:

   // To remove it should be 
   monitorInternet.InternetConnectionAvailableEvent -= HandleInternetConnectionEvent;  // CORRECT

Один и тот же метод можно вызывать несколько раз, не удаляя его.

Если я сделаю monitorInternet.InternetConnectionAvailableEvent -= null;, все обработчики событий будут удалены. Я имею в виду, если он установлен 2-3 раза и удален только один раз, сделав его нулевым, все остальные методы будут удалены автоматически.

Я верю, что так и будет, но я просто хотел подтвердить, эксперты. При поиске в Google я не получил требуемый удовлетворительный ответ.

Пожалуйста, поправьте меня, если я неправ.

Ответы [ 3 ]

12 голосов
/ 22 июня 2011

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

InternetConnectionAvailableEvent.GetInvocationList().Length;

Следующий код демонстрирует, что MyEvent -= null не очищает список обработчиков.

public static event EventHandler MyEvent;

[STAThread]
static void Main()
{
   MyEvent += (s,dea) => 1.ToString();
   MyEvent -= null;

   Console.WriteLine(MyEvent.GetInvocationList().Length);
   // Prints 1
   MyEvent = null;
   Console.WriteLine(MyEvent == null);
   // Prints true
}

Чтобы очистить список (что, вероятно, никогда не является хорошей идеей), вы можете установить событие равным нулю (если вы находитесь в классе, который объявил событие).

4 голосов
/ 22 июня 2011

То, что вы описываете, является полевым событием.Это то же самое, что и объявление события, но без тела.

Внутри класса вы можете установить событие равным нулю.Из-за пределов класса вы не можете этого сделать.События следуют методике подписки и отписки.Внутри класса вы ссылаетесь на переменную, за пределами класса вы ссылаетесь на событие.

См. Этот ответ Джон Скит о событиях .

4 голосов
/ 22 июня 2011

Делегаты удаляются по равенству, поэтому вы ничего не удаляете из списка вызовов, потому что в списке вызовов ничего не будет null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...