Foros del Web » Programación para mayores de 30 ;) » .NET »

Mejorar performance de la UI en WinForm

Estas en el tema de Mejorar performance de la UI en WinForm en el foro de .NET en Foros del Web. Hola, necesito me orienten sobre cómo puedo mejorar el performance de la UI de una aplicacion Winform (visual c#). La cuestión es la siguiente: Tengo ...
  #1 (permalink)  
Antiguo 19/10/2015, 10:00
 
Fecha de Ingreso: octubre-2007
Mensajes: 273
Antigüedad: 16 años, 6 meses
Puntos: 5
Mejorar performance de la UI en WinForm

Hola, necesito me orienten sobre cómo puedo mejorar el performance de la UI de una aplicacion Winform (visual c#). La cuestión es la siguiente:

Tengo un formulario principal: y el mismo contiene un ToolStripContainer en el que se muestra un MenuStrip y un StatusStrip, y en el ContentPanel del ToolStripContainer es donde muestro los diferentes modulos de la aplicacion en dependencia del escogido en el menu principal.

Los modulos estan diseñado a manera de UserControl, de forma que cada uno encierra la lógica de carga de datos del modulo y sus propias barras de herramientas y barras de estado (prpias del modulo).

La situación es que muchas veces al cargar alguno de estos modulos, como que se muestrar por parte, hasta que no se carguen los datos de la BD, etc...

Otra situación es la siguiente:

La aplicacion muestra reportes en dependencia de las fechas seleccionadas en un formulario, el mismo tiene un evento que es el que envia las fechas y una vez disparado mando a cerrar el formulario, pero evidentemente, hasta que no se muestra el reporte (en caso que la carga de los datos desde la base de datos se haga lenta) no se cierra el formulario de fechas.

es mas o menos así:

Código:
// Desde el formularioPricipal:
FormFechas frm=new FormFechas();
frm.NotificarFechasSeleccionadasEvent+= ...... suscribirAlEvento(MostrarReporteFechas);
frm.ShowDialog(this);

private void MostrarReporteFechas(DateTime fechaI, DateTime fechaF)
{
     // Crear dataSet tipado
     // crear ReportDocument
    // asignar dataset al report docuemtn.

   // crear instancia dle formualrio que ocntiene el visor de reportes asignandolo el reportDocument
 // mostrar el reporte
}

}
Ahora bien el el evento clic de un boton del formualrio de fechas llamo al evento
NotificarFechasSeleccionadasEvent y despues al metodo Close() del formulario.

Es por ello, que aunque se llame al evento en el Clic del boton, hasta que no se muestre el reporte, no se llamara al mentod Close() del formulario de fechas.
Cómo mejorar este comportamiento??
  #2 (permalink)  
Antiguo 19/10/2015, 18:29
(Desactivado)
 
Fecha de Ingreso: enero-2015
Mensajes: 393
Antigüedad: 9 años, 3 meses
Puntos: 52
Respuesta: Mejorar performance de la UI en WinForm

Claramente tu problema es que estás ejecutando lógica de acceso a datos, etc en el UI thread, que sólo debería utilizarse para realizar tareas de UI.

Te sugiero que investigues sobre programación asincrónica y multi threading. C# hace esto muy fácil mediante el uso de async/await.

Por otro lado, ese ejemplo de código que pusiste me da la impresión de que todo tu código es una galleta interminable de code behind. Te conviene crear una separación adecuada, y mover el acceso a datos a una capa de datos independiente de la UI, la lógica de negocio a una capa de lógica de negocio, etc. etc.

Lamentablemente winforms no favorece demasiado el uso de buenas prácticas, por eso para aplicaciones datacéntricas se recomienda usar WPF y MVVM.
  #3 (permalink)  
Antiguo 20/10/2015, 11:53
 
Fecha de Ingreso: octubre-2007
Mensajes: 273
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Mejorar performance de la UI en WinForm

agleiva
El gran problema es la separación entre UI y Controladores, el acceso a datos si lo tengo separado: clases Entities, Objects, y clases Mapper para consultas, además de una capa que mantiene las reglas del negocio.

dolorosamente uso netframework 2.0 aun para esta aplicacion; no creo que pueda emplear async, pero Threads si me parece. de todos modos me seria de ayuda un ejempl de uso de Threads para la carga de datos.

Saludos.
  #4 (permalink)  
Antiguo 20/10/2015, 12:31
(Desactivado)
 
Fecha de Ingreso: enero-2015
Mensajes: 393
Antigüedad: 9 años, 3 meses
Puntos: 52
Respuesta: Mejorar performance de la UI en WinForm

Cita:
Iniciado por X_fran Ver Mensaje
El gran problema es la separación entre UI y Controladores
Si, esto es precisamente lo que te resuelve WPF.

Cita:
Iniciado por X_fran Ver Mensaje
dolorosamente uso netframework 2.0 aun para esta aplicacion
¿Hay algún motivo válido para semejante atrocidad? .Net no es como java, yo en tu lugar actualizaría a 4.5.1 antes de seguir escribiendo una línea más de código.
  #5 (permalink)  
Antiguo 20/10/2015, 13:54
 
Fecha de Ingreso: octubre-2007
Mensajes: 273
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Mejorar performance de la UI en WinForm

agleiva
La aplicacion esta terminada supuestamente, mi tarea es mejorar el funcionamiento de la UI, no creo pueda cambiarla a netframework 4.*

creo intentaron hacer una separcion en capas, la parte de acceso a datos no estuvo tan mal dividida, pero esa del usuario, le falló a alguien o no separó nada. Por eso quisiera saber si al menos con componentes Backgroundworker en los formularios, pudiera aliviar el congelamiento de las UI en determinadas operaciones de carga de datos, evidentemente se está llamando a las operaciones de manera secuencial.

Lo otro, eso que expuse de que crearan los diferentes modulos como UserControls es aceptable ?? Porque lo otro que se me ocurre es hacer uso de formularios MDI pero tendría que hacer la "desarmazón de los tres pares" en las UI.
  #6 (permalink)  
Antiguo 20/10/2015, 14:43
(Desactivado)
 
Fecha de Ingreso: enero-2015
Mensajes: 393
Antigüedad: 9 años, 3 meses
Puntos: 52
Respuesta: Mejorar performance de la UI en WinForm

Cita:
Iniciado por X_fran Ver Mensaje
La aplicacion esta terminada supuestamente
Solo si tu definición de "terminada" incluye que la performance sea totalmente inaceptable y que la GUI se frize todo el tiempo porque no supieron usar multithreading como corresponde.

Cita:
Iniciado por X_fran Ver Mensaje
mi tarea es mejorar el funcionamiento de la UI
"mejorar" implicaría actualizar la versión del framework (ya que 2.0 es del año 2005 y es totalmente inservible en 2015). A mí personalmente si me dicen "tomá, mejorá esto".. y veo que es una aplicación de .Net 2.0 lo primero que hago es decirles que hay que actualizar el framework. Ante la negativa, agarro mis cosas y me voy a mi casa (*). Me he ido de empresas por situaciones similares, no sería ni la primera ni la última vez.

Cita:
Iniciado por X_fran Ver Mensaje
quisiera saber si al menos con componentes Backgroundworker
Si podés hacer eso, aunque desconozco si .Net 2.0 tiene BWs.

Cita:
Iniciado por X_fran Ver Mensaje
que crearan los diferentes modulos como UserControls es aceptable ??
No uso winforms, pero supongo que si. En WPF con MVVM ViewModel-First, las vistas son UserControls, pero el control de la aplicación y de los datos los hace el ViewModel y no la GUI.

(*) - Mi vieja me enseñó que no se puede pelear contra la ignorancia.
  #7 (permalink)  
Antiguo 21/10/2015, 08:10
 
Fecha de Ingreso: octubre-2007
Mensajes: 273
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Mejorar performance de la UI en WinForm

agleiva
Me han sido de ayuda sus puntos de vista.

Lo primero que hice fue actualizar la .sln a NetFramework 4.5. Tengo en mi poder el VisualStudio2012 Ultimate. Por cierto una aclaración: Yo resido en Cuba, se me hace muy difícil obtener herramientas, de hecho acceder a internet es un calvario, pero bueno, intento resolver.
Continuo: al actualizar a NTFX 4.5, tengo dos situaciones: en el IDE no encuentro el objeto ReportDocument por ningun lado, objetos .rdlc si pero de eso desconozco, se trabajar con ReportDocuments a través del CrystalReport que viene integrado en VisualStudio, pero esta verison no me da la posibilidad de crear un Reporte desde un DataSet, tendría que intentar conseguir una versión de CrystalReport completa.

Estoy mirando que VisualStudio 2012, me dio a entender que hay que crear un proyecto nuevo solo para los Reportes, sin embargo, la solucion que tengo contiene 5 proyectos Winforms diferentes, ademas de las ClassLibraries de Negocio y Acceso a Datos; el hecho es que los ReportDocuments están dispersados junto con sus DataSet tipados en cada uno de los proyectos WinForm. Ahora, cuando intento abrir un Reporte de los que contiene el fichero, el VisualStudio o no entiende la versión de estos o yo no tengo idea, porque lo que me muestra son binarios, que se yo.

Lo otro, las clases Entities y Mappers, las crearon con una herramienta llamada Cooperator Framework, recordar que en la época de NetFramework 2.0 no existia LINQ ni nada eso, creo NHibernate sip ero no se por qué no lo emplearon. Googleando un poco la encontré, pero no creo exista una actualizacion para NetFramework 4.5, como para en caso que necesite regenerar las clases Entities. de todos modos si no se pudiera, tendre que inventar, porque creo que reescribir la capa de acceso a datos: no me parece.

Anh, otra cosa: ya probé con el componente BackgroundWorker, y creo mejoré la carga de uno de los módulos (un userControl completo) de manera asíncrona.
Agegué otro componente de estos al formulario de login y también se nota el cambio, siempre informando al usuario de alguna manera que se está ejecutando una operación (yo trato de hacer similitudes al uso de Ajax en la programaciñon web, que esa es la que domino un poco, jejeje).

Mi duda: tendría que crear componentes BacgroundWorkers distintos para cada una de las cargas de los módulos??.

leyendo un poco la documentación del componente explica que es la manera más simple de no tener que lidiar con Threads, delegados y eventos, de eso no se mucho pero bueno: intento aprender. Aunque al final todo pinta que es a lo que debo recurrir.
  #8 (permalink)  
Antiguo 22/10/2015, 08:27
(Desactivado)
 
Fecha de Ingreso: enero-2015
Mensajes: 393
Antigüedad: 9 años, 3 meses
Puntos: 52
Respuesta: Mejorar performance de la UI en WinForm

Lo de Crystal Reports desconozco porque nunca lo usé. Lo que si es seguro es que mantiene compatibilidad para atrás, con lo cuál no deberías tener mayores problemas.

Por otra parte, me parece que tu código está mal estructurado.

No hace falta que pases la solución entera a 4.5, sino solamente el proyecto que tiene la capa de presentación (winforms). Con esto podrías usar las ventajas del framework moderno, y dejar intacta el resto de la solución. Al menos inicialmente para ver como resulta. Luego podés ir migrando paulatinamente, pero para eso cada "capa" del sistema tiene que estar en su correspondiente proyecto.

De todas maneras, si te resulta bien con los backgroundworkers, podés resolverlo de esa forma y dejar todo como está, al menos por ahora hasta que veas la posibilidad de actualizar el framework.

Última edición por agleiva; 22/10/2015 a las 08:40

Etiquetas: mejorar, performance, visual, winform
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:12.