Detectar fugas WindowHandle en una aplicación de C #
-
19-09-2019 - |
Pregunta
Me encontré con esta excepción Ayer:
Win32Exception: Fehler beim Erstellen des Fensterhandles
podría traducirse:
Win32Exception: Error while creating the windowhandle
Yo sé cómo solucionar esto (incluso escribió un corto entrada de blog sobre el tema - en alemán)
Pero no saber dónde está mi aplicación podría ser 'fugas' Los controles no dispuestos, que todavía tiene ventanas mangos.
¿Hay alguna manera de detectar / búsqueda de instancias que
- aplicar
IDisposable
- Tienes
Parent == null
Los objetos que coincidan con este limitaciones parecen ser buenos candidatos.
Solución
Cualquier perfilador de memoria decente le mostrará las instancias de control. No serán recogidos de la basura, su propiedad Handle los mantiene vivos. Habrá cerca de 10.000 de ellos. También puede verlo con el Administrador de tareas, utilice + Ver Seleccionar columnas y marque los objetos de usuario. Observando el aumento cuentan como que está probando la aplicación debe proporcionar una sugerencia decente.
Una revisión de código debe recorrer un largo camino también, no hay que muchas maneras posibles fugas a una ventana. Primero busque el caso más común, código que llama Controls.Clear () o Controls.Remove / A (), pero que también se deshaga el control. Siguiente caso común es la clase SystemEvents, hay que darse de baja de forma explícita sus eventos. El resto no son tan fáciles de encontrar, que había necesidad de que perfilador.
Búsqueda de los mangos a sí mismo en tiempo de ejecución es técnicamente posible con la reflexión. Las asas se almacenan en System.Internal.HandleCollector.handleTypes []. Bueno, técnicamente.
Otros consejos
Cada objeto que implementa IDisposable
tiene un método Dispose
. Este método debe ser llamado cuando el objeto ya no es necesaria. Es utilizado en un solo método, lo rodean con una declaración using
(llamadas Dispose
automáticamente). Si se trata de una variable miembro de la clase, su clase debe implementar IDisposable
sí. FxCop tiene una regla de verificación para esto.
Si no se recogen se debe a algún otro objeto hace referencia a los controles, ni llamar ni disponer el establecimiento de los padres a nula es suficiente. Tal vez va a conectar a los acontecimientos y no dettaching de ellos.
Comprobar especialmente el caso de unir a los eventos de los controles no están contenidas por el fijador, en este caso siempre se debe separar de los eventos al desechar los controles, si no el control todavía seguirá siendo referenciado por el fijador y por lo tanto no se dará a conocer