12 votes

Suivre la progression lors de l'utilisation de Parallel.ForEach

Je suis en train de refactoriser mon programme pour utiliser Parallel.ForEach. Avant, lorsque j'utilisais une boucle for classique, je mettais à jour une barre de progression WPF en utilisant Dispatcher, affichant le % complet en divisant l'indice actuel du tableau par la taille du tableau. Avec une boucle parallel foreach cela ne s'affiche pas correctement, c'est-à-dire que le % saute de manière erratique, ce qui est attendu.

Comment puis-je mettre à jour une barre de progression WPF à partir d'une boucle parallel foreach pour suivre le nombre d'itérations terminées?

10voto

Tomas Petricek Points 118959

Comme le suggère SLaks, vous devriez simplement incrémenter la valeur de la barre de progression au lieu de la définir sur l'index actuel que vous avez obtenu de la méthode Parallel.For.

Cependant, je recommanderais sérieusement d'utiliser un moyen moins coûteux que d'envoyer un message au thread de l'interface utilisateur à chaque itération. Si vous avez un grand nombre d'itérations, envoyer un message à chaque itération pourrait être assez exigeant. Vous pourriez déclarer une variable locale count et utiliser Interlocked.Increment pour incrémenter la variable en toute sécurité dans le corps de la boucle parallélisée.

  • Ensuite, vous pourriez utiliser quelque chose comme if (count % 10 == 0) // ... pour mettre à jour l'interface graphique uniquement après 10 itérations. (Ce n'est pas entièrement correct, car d'autres threads peuvent mettre à jour le count avant que vous ne vérifiiez, mais s'il s'agit uniquement de la notification de l'interface graphique, cela ne devrait pas poser de problème – vous ne voulez certainement pas utiliser lock dans le corps de la boucle).

  • Alternativement, vous pourriez créer un minuteur qui vérifierait régulièrement la valeur de count depuis le thread 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.

4voto

SLaks Points 391154

Chaque fois que vous terminez une opération, vous devez afficher un message sur le thread UI (en appelant Dispatcher.BeginInvoke) qui incrémente la barre de progression de 1.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X