Выполнение собственного цикла обработки событий .NET - PullRequest
0 голосов
/ 02 октября 2008

Несколько лет назад я прочитал книгу, в которой рассказывалось, как можно переопределить реализацию диспетчера событий по умолчанию в .NET с помощью собственного процессора.

    class foo {
       public event EventHandler myEvent;
       ...
    }

    ...
      myFoo.myEvent += myBar1.EventHandler;
      myFoo.myEvent += myBar2.EventHandler;

Каждый раз, когда происходит событие, будут вызываться как обработчики myBar1, так и myBar2.

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

У меня вопрос в два раза:

  1. Кто-то знает, какую книгу я читал?
  2. Почему вы хотите переопределить реализацию по умолчанию (на которую можно ответить в книге)?

Edit: книга, на которую я ссылался, действительно была CLR Джеффри Рихтера через C #

Ответы [ 3 ]

8 голосов
/ 02 октября 2008

Это могла быть одна из многих книг или веб-статей.

Существуют различные причины, по которым вы можете изменить порядок подписки / отмены подписки на события:

  • Если у вас есть много событий, многие из которых могут быть не подписаны, вы можете использовать EventHandlerList , чтобы уменьшить использование памяти
  • Вы можете войти в систему подписки / отписки
  • Возможно, вы захотите использовать слабую ссылку, чтобы избежать привязки срока жизни подписчика к вашей
  • Вы можете изменить блокировку, связанную с подпиской / отпиской

Я уверен, что есть и другие - это с моей головы:)

РЕДАКТИРОВАТЬ: также обратите внимание, что есть разница между пользовательским способом обработки подписки / отмены подписки и пользовательским способом вызова события (который может вызвать GetInvocationList и гарантировать, что все обработчики вызываются, например, независимо от исключений) .

2 голосов
/ 02 октября 2008

Кажется, я помню нечто подобное в CLR Джеффри Рихтера через C #. Редактировать: Я точно помню, что он подробно рассказывает об этом.

Есть несколько разных причин взять контроль над регистрацией события. Одним из них является уменьшение раздувания кода, когда у вас есть тонны событий. Я думаю, что Джеффри подробно рассказал об этом в книге ...

1 голос
/ 02 октября 2008
  1. Нет
  2. Например, вам может потребоваться разорвать цепочку вызовов на основе результата одного из обработчиков. Скажем, у вашего объекта CustomEventArgs есть свойство «Заблокировано», которое при значении true подавляет все последующие вызовы обработчика событий.
...