c# asp.net events idisposable red-gate-ants

c# - Los controladores de eventos no registrados causan pérdida de memoria



asp.net events (2)

En primer lugar, solo para probar el punto, intente registrar la adición y eliminación de eventos en un archivo de texto simple. Luego, verifica cuántos fueron agregados vs eliminados.

Parece que hay un error en algún lugar de la lógica empresarial que no anula el registro del evento en todas las circunstancias.

Estoy manteniendo una aplicación web que tiene una pérdida de memoria.

Basado en mi investigación usando el generador de perfiles de memoria ANTS de Red Gate, estoy bastante seguro de que la fuga de memoria es causada por controladores de eventos en la capa de negocios.

Hay una colección que registra un controlador de eventos en cada elemento que se agrega para que la colección pueda volver a ordenar cuando se cambia la fecha del elemento. Parece que este controlador de eventos es el culpable.

La capa de negocios para esta aplicación es bastante complicada, por lo que mantener la colección y sus elementos en la memoria arrastra un montón de otros objetos con ella.

Implementé IDisposable en la colección y eliminé los controladores de eventos en el método Dispose:

p.OnPunchDateChanged -= this.OnPunchDateChanged;

Sin embargo, implementar IDisposable no ayuda, ya que no puedo ajustar todas las referencias a la colección al usar o try / catch blocks. Esta colección es utilizada por partes de la aplicación sobre las que no tengo control.

¿Cómo puedo borrar estos manejadores de eventos para resolver esta fuga de memoria?


El método de eliminación en la colección debe ser llamado directamente por su código porque el evento contiene una referencia a la colección. Su colección nunca será destruida por el recolector de basura.

También debe cambiar el comportamiento de los métodos Eliminar y Limpiar de la colección para separar el controlador de eventos de los elementos eliminados.