¿Hay una forma simple de iterar en todos los manipuladores suscritos a un evento determinado? Mi problema es que los clientes se suscriben, pero olvidan cancelar la suscripción, por lo que se produce una pérdida de memoria. Necesito una forma para que un objeto desconecte todos los manejadores de sus eventos en el método Dispose para que no ocurra una fuga, al menos no por los eventos.C# Cómo cancelar la suscripción a todos los controladores de eventos de un evento determinado?
Respuesta
conjunto nulo a su evento: MyEvent = null;
Pero es realmente mejor para hacer que los clientes darse de baja de su evento.
Un enfoque alternativo es utilizar el llamado patrón de "delegado débil". Cuando utiliza esta técnica, el evento hace referencia a los clientes solo usando WeakReference
que no los mantiene en la memoria. Los clientes serán recogidos basura cuando ya no se los referencia desde otra parte de la aplicación (y el controlador también puede ser no registrado automáticamente cuando se recopila el cliente).
Esto se usa generalmente para resolver el problema con el "olvido" de los clientes para darse de baja de un evento .NET, por lo que parece que esto podría ser adecuado para su problema.
- Dusing Campbell tiene un bonito article about weak delegates.
- También me gustó esto overview at CodeProject, que analiza la mayoría de los escenarios.
- Weak Events también se usan en WPF, pero este enfoque parece un poco complicado (para mí).
La pérdida de memoria ocurre solo si otro objeto (oyente) muere antes que su objeto (origen del evento). En este caso, el origen del evento aún conserva la referencia al oyente, lo que impide que se recopile el oyente. Cuando el origen del evento muere, el oyente no suscrito también puede ser recogido.
Si el origen del evento muere antes del oyente, esto no impide que el oyente se recopile más tarde, cuando todas las demás referencias al mismo se establecen en nulo.
Esto significa que el origen del evento El método de eliminación no es el lugar correcto para resolver este problema. Puede resolverse solo en un código de escucha. Simplemente hablando, no puede hacer nada, excepto pedirle a sus clientes que escriban un código limpio.
En el momento de escribir, la respuesta más precisa es la menos popular.
Puede anular el controlador de eventos, pero esto se eliminará de todos modos después de que su propietario sea desactivado; no está mal que sea súper ordenado, pero como Alex dice, no es donde está el problema.
La clase de origen de Adi permitirá que los objetos de escucha se recopilen cuando se recopila, no hay duda. Entonces, el problema es que el objeto fuente de Adi se mantiene abierto, posiblemente a partir de una larga cadena de referencias en el código de su cliente.
La siguiente publicación de blog también analiza una solución que Adi está describiendo y explica por qué no es necesaria.
- 1. ¿Debo anular la suscripción a todos los controladores de eventos?
- 2. ¿Cómo puedo cancelar la suscripción a este evento .NET?
- 3. jQuery Controladores de eventos múltiples: ¿cómo cancelar?
- 4. ¿Es posible eliminar todos los controladores de eventos de un elemento determinado en javascript?
- 5. C# Controladores de eventos
- 6. Cómo eliminar todos los controladores de eventos Click en Jquery
- 7. Anular la suscripción programáticamente al evento
- 8. C# controladores de eventos personalizados
- 9. ¿El siguiente patrón de cancelar su suscripción a un evento por cierre podría causar algún problema?
- 10. C# Suscripción de evento dinámico
- 11. Prisma Cancelar suscripción con token de suscripción no funciona
- 12. ¿Cómo eliminar todos los controladores de eventos Click?
- 13. Suscripción de evento de un solo disparo
- 14. Crear controladores de eventos C# vacíos automáticamente
- 15. Cancelar la suscripción de LocationListener del LocationManager
- 16. WPF Custom Routed Events - ¿Cómo cancelar la suscripción?
- 17. Heredando controladores de eventos en C#
- 18. ¿Los controladores de eventos en C# deberían generar alguna excepción?
- 19. ¿Los controladores de eventos no están seguros?
- 20. ¿Cómo deshacerse de los controladores de eventos de forma segura?
- 21. C# - funciones anónimas y controladores de eventos
- 22. ¿Duplicar los controladores de eventos de un elemento a otro?
- 23. Anular la suscripción a eventos de EventAggregator en ViewModels
- 24. Nombrar correctamente los eventos y controladores de C#
- 25. Controladores de eventos en C# - sintaxis/patrón
- 26. Cómo cancelar un evento en winforms?
- 27. ¿Agregar controladores de eventos múltiples para un evento en XAML?
- 28. Eventos de suscripción en VB.NET
- 29. ¿Cómo averiguas qué está suscrito a un evento en C#?
- 30. Cuándo conectar los controladores de eventos asp.net
No es posible configurar un evento en nulo, en C#. –
En realidad es posible, si estás dentro de la clase donde se declaró el evento. –
Tiene razón. –