2010-10-06 6 views
11

Je suis en train de refactoriser mon programme pour utiliser Parallel.ForEach. Avant, lorsque j'utilisais une boucle for régulière, je mettais à jour une barre de progression WPF à l'aide de Dispatcher, en affichant le% achevé en divisant l'index du tableau en cours par la taille du tableau. Avec une boucle foreach parallèle, ceci ne s'affiche pas correctement, c'est-à-dire que le% saute de manière erratique, ce qui est attendu.Suivre la progression en utilisant Parallel.ForEach

Comment puis-je mettre à jour une barre de progression WPF à partir d'un parallèle pour chaque boucle afin de pouvoir suivre le nombre d'itérations terminées?

Répondre

9

Comme SLaks suggère, vous devez simplement augmenter la valeur de la barre de progression au lieu de en le plaçant à l'index courant que vous avez obtenu de la méthode Parallel.For

Cependant, je considérerais sérieusement l'utilisation d'un moyen moins cher que d'envoyer un message à l'IU thread à chaque itération.Si vous avez un grand nombre d'itérations, l'envoi d'un message à chaque itération peut être très exigeant Vous pouvez déclarer une variable locale count d utilisez Interlocked.Increment pour incrémenter la variable en toute sécurité dans le corps de la boucle parallélisée.

  • Ensuite, vous pouvez utiliser quelque chose comme if (count % 10 == 0) // ... de mettre à jour l'interface graphique seulement après 10 itérations. (Ce n'est pas tout à fait correct, car d'autres threads peuvent mettre à jour le count avant de vérifier, mais si c'est juste pour le but de la notification GUI, alors cela ne devrait pas importer - vous ne voulez certainement pas utiliser lock dans le corps de la boucle).

  • Vous pouvez également créer un temporisateur qui vérifierait de manière répétée la valeur de count à partir de l'unité d'exécution de l'interface graphique et mettrait à jour la barre de progression. C'est peut-être encore plus facile et vous pouvez garantir que la barre de progression sera mise à jour assez souvent, mais pas plus.

4

Chaque fois que vous avez terminé une opération, vous devez envoyer un message au thread d'interface utilisateur (en appelant Dispatcher.BeginInvoke qui incrémente la barre de progression par 1.

Questions connexes