2012-05-09 28 views
15

Actualmente estoy aprendiendo sobre WPF y me he topado con el concepto de los eventos débiles, pero realmente estoy luchando para 'obtenerlo'. He leído innumerables artículos sobre Stackoverflow y mirado ejemplos de código, pero simplemente no se hunde en¿Cómo funcionan los eventos débiles?

Aquí está mi dilema:.

  1. entiendo que cuando un objeto se suscribe a un evento, la fuente de la evento debe contener una referencia al suscriptor.
  2. También entiendo que si el suscriptor queda fuera del alcance o se destruye explícitamente pero el origen del evento no se destruye, entonces el suscriptor no será basura porque el origen del evento aún conserva una referencia al suscriptor.
  3. Un método común para evitar esto es suscribir explícitamente al suscriptor de la fuente antes de que se destruya el objeto. Entiendo que esto puede ser un problema si el programador no puede determinar cuándo ocurrirá esto.

Así que de lo anterior entiendo cómo el uso de eventos puede causar pérdidas de memoria y por qué hay una necesidad de un patrón de referencia débil pero lo que me impide entender es cómo el patrón de eventos débiles realmente logra este objetivo ? ¿Qué hace de manera diferente?

Seguramente, incluso si hay una clase que gestiona eventos, todavía tiene que suscribirse y anular la suscripción de los manejadores a/desde la fuente, por lo tanto las referencias deben existir, dando los mismos problemas con la forma estándar de usar eventos.

Alguien por favor explíqueme qué concepto fundamental me falta o no entiendo y ayúdeme a 'obtener' el patrón de evento débil.

Respuesta

16

Lo que hace falta es que los eventos débiles (que usan Weak References debajo de las cubiertas, que a su vez usan un GCHandle) están aprovechando el comportamiento incorporado de CLR para el caso particular de tener que acceder a un objeto sin tener una referencia fuerte es decir, no están limitados por las "reglas" normales a las que está sujeto el código de su aplicación.

Ver http://sankarsan.wordpress.com/2008/08/09/weak-references/

Detrás de las escenas, la WeakEventManager está sosteniendo una referencia débil al suscriptor de eventos. Si el suscriptor pasa a ser GC antes de que se produzca el evento, el WeakEventManager simplemente se encoge de hombros y dice "OK, ese tipo está muerto, voy a dejar de intentar notificarlo de este evento a partir de ahora"

+0

@ El enlace ChrisSinclair está abajo :( – SuperJMN

+1

@SuperJMN: Gracias. Aquí hay un enlace actualizado: https://bkiener.wordpress.com/2010/02/11/simple-weak-event-listener-for-silverlight/ –

Cuestiones relacionadas