2011-07-30 43 views
6

Tengo una aplicación de winforms. la forma principal tiene muchos controles y esa es una de las razones por la que carga muy lento. lo que me gustaría hacer es hacer que la forma cargue más rápido.Cómo cargar una aplicación de winforms rápidamente

He configurado el beginupdate y endupdate. El formulario no se representa en el hilo de trabajo de fondo, porque esta es la forma principal. No hay formularios iniciales. Cuando el usuario hace clic en el icono de la aplicación, esta es la primera forma que se carga. Agregar una barra de progreso o cualquier forma de salpicadura no es una buena idea para mí.

He consultado otras preguntas aquí en Desbordamiento de pila, pero no parecen tener el mismo problema que yo.

Si tiene algunos ejemplos/ideas que tenga en mente, sería agradable si puede compartirlos conmigo.

Gracias y Saludos Gagan Janjua

+1

Me resulta difícil de creer que la carga de controles regulares se tome mucho tiempo. No se trata de otras cosas que se cargan lentamente? Muestre algún código –

+1

No es la carga lenta, la pintura lleva mucho tiempo con muchos controles. Usa menos controles. –

Respuesta

10

algunas sugerencias:

  • tratar de minimizar la complejidad de la interfaz de usuario. Sus usuarios se lo agradecerán y tendrá menos controles para cargar. Por ejemplo, si tiene 3 o 4 controles que no se usan con frecuencia, ¿puede moverlos a un cuadro de diálogo o desplegable de la sección "avanzada" de su formulario, para poder postergar la creación/presentación? ¿Se necesitan todos los controles? De Verdad? Piense en el flujo de trabajo que está tratando de lograr: ¿el conjunto actual de controles es la forma más simple de lograr el flujo de trabajo? ¿Deben mostrarse todos los controles a la vez? ¿Quizás podría colocarlos en pestañas separadas en un control de pestañas (y así solo creará realmente los controles a medida que se muestra la pestaña)?

  • ¿Se puede reducir el rango de tipos de control utilizados? Cada nuevo tipo de control puede hacer que su programa cargue un nuevo dll para que lo soporte. Cada dll que debe inicializarse causa un tiempo de inicio adicional.

  • ¿Está utilizando algún control que sea lento para iniciarse? Un campo de texto simple será rápido, pero un control de gráficos complejo puede ser lento.

  • ¿Cuántos montajes (propios) se cargan? Combine todo el código en un solo ensamblaje (por ejemplo, con ILMerge) y los tiempos de carga probablemente mejorarán bastante.

  • Elimine cualquier código de inicialización que no sea necesario. ¿Puedes simplificar la inicialización? ¿Se puede diferir cualquier inicialización (p.solo cree algunas variables miembro cuando el usuario haga clic en el primer botón que realmente necesita que estén presentes, No intente crear una conexión a una base de datos si aún no es necesario, etc.)

  • ¿Puede postergar? creación de (algunos de) la UI? Por ejemplo, puede colocar un grupo de controles en un formulario UserControl separado y luego agregar este formulario programáticamente a su MainForm poco después del inicio (por ejemplo, en un temporizador). Esto permitirá que su MainForm aparezca muy rápidamente, y luego será "poblada" poco después con controles adicionales, lo que puede no mejorar el tiempo de inicio real, pero se "sentirá" mucho más rápido y más receptivo para iniciarse. (Este enfoque también puede ser muy eficaz si sus pergaminos Mainform y los controles adicionales inicialmente no están en la pantalla, ya que sólo necesitan ser creados si el usuario se desplaza suficientemente hacia abajo para verlas)

  • ¿Estás Viendo ninguna información que puede tardar en cargarse (por ejemplo, imágenes de mapa de bits grandes o datos obtenidos de un servidor SQL)? ¿Puede diferir la carga de ellos o ejecutarlo como un hilo de fondo? Use compresión para acelerar la carga? ¿Reducen su resolución para minimizar la cantidad de datos que se deben cargar? ¿Preprocesa los datos y los almacena en un caché de inicio rápido para la próxima vez que se ejecuta el programa?

  • ¿Se pueden reemplazar algunos controles por un enfoque optimizado? p.ej. Puede crear una "barra de botones" como un conjunto de 10 controles separados, o como un solo control que se dibuja con la apariencia de 10 botones. Es mucho más fácil hacer que el control único inicialice y vuelva a dibujar más rápido que 10 controles separados.

Y, por supuesto, una vez que la más obvia fruta madura que se ha recogido (o incluso antes):

  • Ejecutar el programa en un generador de perfiles y ver dónde está gastando su tiempo.
+2

Ejecuté el generador de perfiles y casi el 52% de la demora se debió a la forma Inicialización. Tengo un entorno IDE donde hay muchos otros controles que el usuario podría necesitar en un momento dado ... ese es el problema ... – Gagan

+1

Sin embargo, me gustan tus ideas ... intentaré implementar la mayoría de ellas ... sin embargo. .He decidido usar un hilo de trabajador de fondo para ayudar a cargar algunos de los controles – Gagan

2

tratar de minimizar el código que se ejecuta durante on load de forma principal o cualquiera de los de control que se coloca en el formulario principal.

También puede explorar NGEN que es la herramienta de Microsoft que ayuda a mejorar el rendimiento de aplicación gestionada

+1

Utilicé NGEN. Aunque el período de tiempo para cargar la IU ha disminuido aún, me gustaría que la UI se muestre tan pronto como el usuario inicie la aplicación – Gagan

+2

que comprobé con y sin ngen ... la puesta en marcha sin NGEN fue de 7225 milisegundos ... después de ejecutar este ngen command ngen install el tiempo de inicio disminuyó en más de la mitad. ahora es 3015 .. milisegundos – Gagan

0

Cuando se carga un formulario que inicializa todos sus controles.
El formulario en sí no te está llevando mucho tiempo ... Son tus controles.

Revise sus controles y verifique qué se puede mejorar en sus constructores e inicializadores.

+1

cierto, son los controles .. estoy usando una biblioteca de acoplamiento, algunos controles de Krypton. son ricos en características pero también vienen con una etiqueta de memoria. he visto algunas otras aplicaciones que usan el mismo conjunto de controles pero cargan bastante rápido. Me preguntaba si podría hacer lo mismo ... – Gagan

0

¿Necesita todos los controles de inmediato? Si no, quizás podría cargarlos programáticamente después de algunos incendios de eventos que le permiten saber que necesita ese control.

Cuestiones relacionadas