Pregunta

Tengo el siguiente código para permitir que la GUI responda a un cambio en la colección.

myObservableCollection.CollectionChanged += ((sender, e) => UpdateMyUI());

En primer lugar, ¿es esta una buena manera de hacer esto?

Segundo: ¿cuál es el código para cancelar la suscripción a este evento? ¿Es lo mismo pero con - = (y luego el método anónimo completo de nuevo)?

¿Fue útil?

Solución

Si necesita darse de baja de un evento, necesita una referencia de instancia. Desafortunadamente, eso significa que no puedes usar esa sintaxis en particular.

Otros consejos

En primer lugar ... sí, es una buena forma de hacerlo, es limpio, de forma pequeña y fácil de leer & amp; entiendo ... la advertencia, por supuesto, es " A menos que luego desees cancelar la suscripción " ;.

Creo que Jon Skeet señaló antes de eso " la especificación explícitamente no garantiza el comportamiento de ninguna manera cuando se trata de la equivalencia de delegados creados con métodos anónimos. "

Por lo tanto, si necesita darse de baja del evento en un momento posterior, sería mejor que cree una instancia de delegado para poder adherirse a la referencia para más adelante.

var myDelegate = delegate(sender, e){UpdateMyUI()};

myObservableCollection.CollectionChanged += myDelegate;

myObservableCollection.CollectionChanged -= myDelegate;

Es una buena manera de hacerlo, a menos que myObservableCollection vaya a vivir más que 'this', en cuyo caso podría terminar con una pérdida de memoria, ya que el delegado que se crea entre bastidores conservará una referencia a su ' esto ', que lo mantendrá vivo. Si está creando y 'destruyendo' repetidamente lo que esté escuchando el evento, encontrará que el recolector de basura no los está recolectando.

Si esto es un problema, puede seguir la ruta sugerida en las respuestas, conservando una referencia al controlador, que debe crear primero.

Otra solución es usar referencias débiles para crear un controlador de eventos que permita que el suscriptor sea recolectado si no hay otras referencias. He explorado esta solución en esta pregunta y respuesta .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top