.net wpf events design-patterns weak-events

.net - ¿Cuál es el patrón de "Evento débil" utilizado en las aplicaciones de WPF?



events design-patterns (3)

El bit importante está en los comentarios:

La razón principal para seguir el patrón WeakEvent es cuando el origen del evento tiene un tiempo de vida del objeto que es potencialmente independiente de los detectores del evento. El uso del despacho central de eventos de un WeakEventManager permite que los manejadores del oyente sean recolectados como basura incluso si el objeto fuente persiste

Por lo tanto, si tiene objetos de publisher y subscriber , normalmente, después de que el subscriber se suscriba al evento del publisher , el subscriber no puede ser recolectado como basura. El patrón de evento débil hace que el vínculo entre los dos sea "débil" (como en WeakReference ), de modo que no existe esta dependencia. (La alternativa es darse de baja del evento cuando el subscriber quiera ser elegible para la recolección de basura, pero eso se complica).

La DLL de WindowsBase define el evento IWeakEventListener con un resumen:

Proporciona soporte para escuchar eventos para las clases que esperan recibir eventos a través del patrón WeakEvent y System.Windows.WeakEventManager.

Esta descripción vaga no describe qué es en realidad el ''patrón de evento débil''.

Entonces, ¿cuál es este patrón, por qué se usa y es útil fuera de las aplicaciones de WPF?

EDITAR Algunas buenas respuestas ya, pero nadie ha hablado si este patrón es útil fuera de las aplicaciones de WPF. Me parece que el patrón de eventos débiles, como las propiedades de dependencia, está inextricablemente vinculado a las API y DLL de WPF. ¿Hay una implementación equivalente disponible para las aplicaciones que no son de WPF?


Patrones WeakEvent

La suscripción a eventos puede ocasionar que los suscriptores no sean recopilados. Supondría que el objeto se recopilaría ya que no tiene otra referencia: sin embargo, el editor del evento conserva el objeto detector y lo mantiene en la memoria (a menos que anule la suscripción explícita, en cuyo caso debe saber exactamente cuándo Para darse de baja). Una fuga administrada

Como regla general, si el editor del evento va a esperar más tiempo que el oyente, puede encontrarse con este problema y debería verificarlo.

WeakEvents debería ayudarlo en que el objeto se recolectaría si las únicas referencias activas al mismo son ''Débiles''. Debería preocuparse por este patrón solo si planea desarrollar controles nuevos, que generalmente exponen muchos eventos.

La idea básica es similar a WeakReference wrt garbage collection.


En .NET 4.5, existe un soporte mejorado para establecer una referencia débil a un evento. Lee mas