2009-02-05 23 views
15

El WindowsBase DLL define el evento IWeakEventListener con el resumen:¿Cuál es el patrón de "Evento débil" utilizado en las aplicaciones de WPF?

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

Esta vaga descripción no describe en realidad qué es el "patrón de WeakEvent".

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

EDIT 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?

+0

Creo que las referencias débiles son un enfoque más generalizado del problema y se pueden usar fuera de WPF. Parece que WeakEventManager es un caso especializado de referencias débiles para el manejo de eventos de WPF. – Philippe

Respuesta

23

El bit es importante en los comentarios:

La razón principal para seguir el patrón de WeakEvent es cuando el origen del evento tiene una duración de objetos que es potencialmente independiente del evento oyentes. Utilizando el centro de eventos envío de una WeakEventManager permite manipuladores del oyente para ser basura recogida incluso si el objeto de origen persiste

Así que si usted tiene publisher y subscriber objetos, entonces normalmente después subscriber ha suscrito a publisher ' s evento, subscriber no se puede recolectar basura. El patrón de evento débil hace que el enlace entre los dos sea "débil" (como en WeakReference), por lo que no existe esta dependencia. (La alternativa es dejar de recibir el evento cuando subscriber quiere ser elegible para la recolección de basura, pero que se complica.)

+1

¿Cómo se complica todo? – zvolkov

+6

@zvolkov: porque de repente el suscriptor necesita * saber * cuándo quiere ser elegible para la recolección de basura, que a menudo puede terminar con un conocimiento adicional que se propaga por todo el sistema, y ​​de repente ha perdido la mitad del beneficio de * automático * recolección de basura. –

+1

De acuerdo, los manejadores que se dan de baja se vuelven desordenados. ¡Pero también debe haber una sobrecarga con "WeakReference"! Lo menos que puedo pensar es en el trabajo extra que GC necesita hacer para restablecer el objeto de referencia débil a nulo cuando el objeto se elimina de la memoria. –

10

WeakEvent Patterns

La suscripción a eventos puede dar lugar a los abonados que no están recogiendo. Supondría que el objeto se recopilaría ya que no tiene otra referencia: sin embargo, el editor del evento se queda con el objeto detector y lo mantiene en la memoria (a menos que anule la suscripción explícita, en cuyo caso necesita saber exactamente cuándo Para darse de baja). Una fuga administrada

Como regla general, si el editor de eventos 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á si las únicas referencias activas 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 w.r.t. recolección de basura.

5

En .NET 4.5, existe una compatibilidad mejorada para establecer una referencia débil a un evento.Read more

+0

Hola Jowen, ¿estás diciendo que es nuevo en 4.5 pero no puedo encontrar la diferencia entre 3.0, 3.5, 4.0 y 4.5? Me puede decir qué es ? –

+0

El enlace está roto ... – Maxence

Cuestiones relacionadas