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.

¿Fue útil?

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

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