Pregunta

Hace unos años, leí un libro que describía cómo se podía anular la implementación de "dispatcher" del evento predeterminado en .NET con su propio procesador.

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

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

Siempre que se active el evento, se llamarán a los controladores myBar1 y myBar2.

Como recuerdo, la implementación predeterminada de este bucle utiliza una lista vinculada y simplemente itera sobre la lista y llama a los delegados de EventHandler en orden.

Mi pregunta es doble:

  1. ¿Alguien sabe qué libro estaba leyendo?
  2. ¿Por qué querría anular la implementación predeterminada (que podría responderse en el libro)?

Editar: el libro al que me refería era de hecho CLR de Jeffrey Richter a través de C #

¿Fue útil?

Solución

Podría haber sido uno de los muchos libros o artículos web.

Hay varias razones por las que puede querer cambiar la forma en que se suscriben / cancelan las suscripciones:

  • Si tiene muchos eventos, muchos de los cuales pueden no estar suscritos, puede usar EventHandlerList para disminuir el uso de la memoria
  • Es posible que desee registrar la suscripción / desuscripción
  • Es posible que desee utilizar una referencia débil para evitar que la vida útil del suscriptor esté vinculada a la suya
  • Es posible que desee cambiar el bloqueo asociado con la suscripción / cancelación de la suscripción

Estoy seguro de que hay más, están fuera de mi cabeza :)

EDITAR: También tenga en cuenta que hay una diferencia entre tener una forma personalizada de gestionar la suscripción / desuscripción y una forma personalizada de elevar el evento (que puede llamar a GetInvocationList y garantizar que se llame a todos los manejadores, independientemente de las excepciones, por ejemplo) .

Otros consejos

Me parece recordar algo similar en CLR de Jeffrey Richter a través de C #. Editar: definitivamente recuerdo que él entra en detalles al respecto.

Hay algunas razones diferentes para tomar el control del registro de eventos. Una de ellas es reducir el código cuando tienes TONELADAS de eventos. Creo que Jeffrey entró en esto en detalle dentro del libro ...

  1. No
  2. Es posible que, por ejemplo, necesite romper la cadena de llamadas en función del resultado de uno de los controladores. Supongamos que su objeto CustomEventArgs tiene una propiedad 'Bloqueada', que cuando se establece en true suprime todas las invocaciones de controlador de eventos.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top