Pregunta

Estoy procesando archivos grandes después de ser seleccionados por el usuario. Mi código se parece al siguiente:

if (FileDialog.ShowDialog() == true) { 
    // process really big file
}

Esto congela la interfaz de usuario, así que intenté mostrar un mensaje de carga primero antes de que un usuario seleccionó el archivo para darles una señal visual de que algo estaba sucediendo:

loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) { 
    // process really big file
}

Desafortunadamente, esto todavía congela por completo la interfaz de usuario mientras se procesa el archivo.

Lo que he encontrado que funciona perfectamente es si disparo un cuadro de mensajes justo después de la selección de archivos. Creo que hace una llamada de tipo "DoEvents" debajo del capó para obtener elementos de eventos FLUSH/UI en el tiempo de ejecución.

loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
    MessageBox.Show("Sync!");
    // process really big file
}

En casos como este, el archivo grande todavía se procesa lentamente, pero se muestra el mensaje de carga y la interfaz de usuario de la pantalla se sincroniza (estoy haciendo otras cosas en lo real, como mostrar un cursor de espera).

Pregunta:

Silverlight no tiene funcionalidad de doevents. ¿Hay una llamada que pueda hacer además de MessageBox. Muestra tener el mismo efecto de sincronizar la interfaz de usuario y evitar que el Filedialog abierto se congele la interfaz de usuario?

¿Fue útil?

Solución

Use un trabajador de fondo para ejecutar el cálculo pesado en segundo plano. Cuando desea notificar a la UI que la operación está completa, se puede utilizar el evento RunWorkerCompleted de la clase mencionada anteriormente. La alternativa a esto es usar un hilo completamente separado y luego devolución de llamada al hilo de la interfaz de usuario usando despachador.beginInvoke (). Recuerde que con .NET en un hilo separado no puede acceder a ningún componente de GUI sin este tipo de sincronización.

Otros consejos

¿Usa la clase de Funcionworker para procesar su archivo realmente grande en un hilo de fondo? Aquí un enlace para ti: Cómo: usar un trabajador de fondo

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