tag remarks c# wpf weak-events

tag - remarks c#



¿Cómo funcionan los eventos débiles? (1)

Actualmente estoy aprendiendo WPF y me he topado con el concepto de eventos débiles, pero realmente estoy luchando por "entenderlo". He leído innumerables artículos sobre Stackoverflow y he visto ejemplos de código, pero simplemente no se está hundiendo.

Aquí está mi dilema:

  1. Entiendo que cuando un objeto se suscribe a un evento, la fuente del evento tiene que mantener una referencia al suscriptor.
  2. También entiendo que si el suscriptor se sale del alcance o se destruye explícitamente pero la fuente del evento no se destruye, entonces el suscriptor no será recolectado como basura porque la fuente del evento aún conserva una referencia al suscriptor.
  3. Un método común para evitar esto es anular la suscripción explícita del 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.

Entonces, de lo anterior, entiendo cómo el uso de eventos puede causar pérdidas de memoria y por qué es necesario un patrón de referencia débil, pero lo que me impide entender es cómo el patrón de evento débil 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 controladores a / desde la fuente, por lo tanto, deben existir referencias, dando los mismos problemas con la forma estándar de usar eventos.

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


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

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

Detrás de escena, WeakEventManager tiene una referencia débil al suscriptor del evento. Si el suscriptor es GC''d antes de que se levante el evento, WeakEventManager simplemente se encoge de hombros y dice: "Está bien, ese tipo está muerto, solo voy a dejar de intentar notificarle este evento de ahora en adelante"