2010-10-06 9 views
11

Estoy refacturando mi programa para usar Parallel.ForEach. Antes, cuando estaba usando un ciclo for para regular, estaba actualizando una barra de progreso de WPF usando Dispatcher, mostrando el% completado al dividir el índice de matriz actual entre el tamaño de la matriz. Con un bucle foreach paralelo, esto no se visualiza correctamente, es decir,% salta eraticamente, lo cual se espera.Seguir el progreso al usar Parallel.ForEach

¿Cómo puedo actualizar una barra de progreso de WPF desde un paralelo para cada ciclo, así puedo rastrear el número de iteraciones completadas?

Respuesta

9

Como SLaks sugiere, sólo debe incrementar el valor barra de progreso en lugar de estableciéndolo en el índice actual que obtuvo del método Parallel.For.

Sin embargo, consideraría seriamente utilizar una forma menos costosa que enviar un mensaje al hilo de la interfaz de usuario con cada iteración. Si tiene una gran cantidad de iteraciones, luego, enviar un mensaje con cada iteración podría ser bastante exigente. Podría declarar una variable local count d use Interlocked.Increment para incrementar la variable de forma segura en el cuerpo del bucle paralelizado.

  • Posteriormente, se podría utilizar algo como if (count % 10 == 0) // ... para actualizar la interfaz gráfica de usuario sólo después de 10 iteraciones. (Esto no es del todo correcto, ya que otros subprocesos pueden actualizar el count antes de comprobar, pero si solo es con el propósito de notificar la GUI, entonces no debería importar: definitivamente no desea usar lock en el cuerpo del bucle)

  • Como alternativa, puede crear un temporizador que verifique repetidamente el valor de count desde el hilo de la GUI y actualice la barra de progreso. Esto es quizás aún más fácil y puede garantizar que la barra de progreso se actualizará con la frecuencia suficiente, pero no más.

4

Cada vez que termine una operación, usted debe enviar un mensaje al hilo de interfaz de usuario (llamando Dispatcher.BeginInvoke que se incrementa la barra de progreso en 1.

Cuestiones relacionadas