Acelerando WinForms


Recientemente tuvimos que revisar una aplicación winforms que se había vuelto muy lenta, cada vez que se instanciaba una nueva ventana o usercontrol tardaba varios segundos en abrirse.
Tras revisar el código vimos que algunos controles se inicializaban en los métodos OnLoad y OnCreateControl. Es un error muy común, ya que hasta que el control no se ha creado no podemos saber si todas sus propiedades tienen el valor correcto y a veces hay propiedades que dependen de otras.
Como sabemos no podemos controlar el orden de creación de los controles en un formulario y no podemos asegurar que un control siempre se creará antes que otro o que una propiedad se asignará antes que otra.
Por nuestra experiencia sabíamos que eso podía ser un problema así que decidimos cambiar algunos controles e implementar en ellos el interface ISupportInitialize.
Este interface es soportado directamente por el entorno de diseño y nos permite ejecutar código en el método EndInit con la garantía de que todos los controles en el formulario ya han sido creados.
El truco está en sustituir el código que había en el OnLoad y moverlo al método EndInit, de esta manera el código se ejecuta dentro del constructor con una ganancia de casi el 50% en velocidad.

Al final de los cambios llegamos a las siguientes conclusiones:

  • Siempre que sea posible realizar la inicialización en el constructor.
  • Evitar iteraciones sobre los controles durante los métodos OnLoad y OnCreateControl. Son mucho más rápidas si se realizan dentro del constructor, incluso usando reflection.
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s