2011-08-29 12 views
7

¿Cómo modifico una propiedad de modelo de vista MVVM Progress para el trabajo que se realiza en una cadena de fondo?Notificación de progreso del hilo de fondo en MVVM?

Estoy creando una aplicación MVVM que ejecuta una tarea en una cadena de fondo, usando Task.Factory.StartNew() y Parallel.ForEach(). Estoy usando this article como guía. Hasta ahora, mi código es el siguiente:

Task.Factory.StartNew(() => DoWork(fileList, viewModel)); 

Dónde fileList es una lista de archivos a procesar, y viewModel es el modelo de vista con la propiedad Progress. El método DoWork() se parece a esto, hasta el momento:

private object DoWork(string[] fileList, ProgressDialogViewModel viewModel) 
{ 
    Parallel.ForEach(fileList, imagePath => ProcessImage(imagePath)); 
} 

el método ProcessImage() realiza el procesamiento de imagen real. La propiedad Progress del modelo de vista está vinculada a una barra de progreso en un cuadro de diálogo que se muestra justo antes de que comience el proceso en segundo plano.

Me gustaría actualizar la propiedad del modelo de vista Progress después de cada iteración de la declaración Parallel.ForEach(). Todo lo que necesito hacer es incrementar el valor de la propiedad. ¿Cómo puedo hacer eso? Gracias por tu ayuda.

+0

¿Es 'Progress' solo un int, float o double? –

Respuesta

7

Dado que la propiedad es una propiedad simple (y no una colección), debe poder establecerla directamente. WPF manejará la clasificación de regreso al hilo de la interfaz de usuario automáticamente.

Sin embargo, para evitar una condición de carrera, tendrá que manejar el incremento de su contador "hecho" explícitamente. Esto podría ser algo así como:

private object DoWork(string[] fileList, ProgressDialogViewModel viewModel) 
{ 
    int done; // For proper synchronization 
    Parallel.ForEach(fileList, 
     imagePath => 
     { 
      ProcessImage(imagePath)); 
      Interlocked.Increment(ref done); 
      viewModel.Progress = done; 
     } 
} 
+0

Y una vez más, gracias Reed! ¡Parece que estoy diciendo esto mucho! Aceptado y +1. –

Cuestiones relacionadas