En parallèle.ForEach Debug ou Étape Par
Est-il un moyen facile pour passer d'un parallèle.foreach? Quelle est la meilleure façon de débogage avec un point de rupture?
- si vous n'avez pas de soins pour déboguer le parallélisme, et vous voulez juste pour vérifier ce qui se passe à l'intérieur de la boucle, le copier sur une série foreach et pas à travers elle (en commentant la parallèle pour la production)
- Plus sûr/plus simple pour faire
Parallel.ForEach
exécuter séquentiellement à des fins de débogage. - ouaip c'est pourquoi je upvoted votre réponse. Jamais pensé avant
Vous devez vous connecter pour publier un commentaire.
Vous pouvez réellement obtenir des résultats similaires avec Visual Studio juste en gel de tous les fils sauf un, sélectionnez tous les threads, mais l'un dans les filets de windows et faites un clic droit -> Gel comme ceci:
Aussi, si vous souhaitez reproduire une condition de concurrence et de s'arrêter sur les points d'arrêt des pauses, vous pouvez toujours ajouter des points de trace ne - soit avec visual studio ou avec les plugins que l'aide, tels que Oz Code
Au cours de debug, je vais souvent à la création de ma
Parallel.ForEach
à exécuter avecMaxDegreeOfParallelism
la valeur 1. Cela rend beaucoup plus simple à déboguer.Cependant, cela n'aidera pas avec le débogage de problèmes concernant les conditions de course ou la synchronisation des données, et en fait souvent de masquer ou d'éliminer les vrais problèmes dans votre code.
Ces problèmes peuvent souvent être débogué beaucoup plus facilement en utilisant les nouveaux outils de VS 2010, comme le En parallèle des Tâches de la fenêtre, ou en utilisant les différentes techniques énumérées à l' Débogage Des Applications Multithread, comme la commutation de threads, verrouillage threads en marchant, etc.
Similaire à d'autres réponses ici, nous avons fixé le degré de parallélisme à 1 lors du débogage, mais nous le faisons avec une méthode d'extension, comme:
Alors, au lieu d'utiliser
.AsParallel()
nous utilisons.AsDebugFriendlyParallel()
Comme @PaulG répondu, je pense que la meilleure pratique est mise
MaxDegreeOfParallelism
de la valeur à1
. Alors normalementParallel
sera également le même travail régulier boucle commeFor
,Foreach
. C'est le moyen plus rapide de débogage surParallel
. Si vous n'avez pas besoin de changer de code entre la boucle etParallel
.Temporairement la réécrire sous la forme d'un non-parallèle foreach, ou utiliser les directives de préprocesseur pour exécuter non parallèles de code lors de l'exécution en mode debug.
J'aime utiliser le "en cas" en option sur un point d'arrêt (cliquez-droit sur le point d'arrêt, sélectionnez "Quand frappe...". Vous pouvez imprimer un message à la console qui inclut des valeurs de variables, le fil que vous êtes sur, etc.
OzCode vous aidera beaucoup, il a une fonction comme les points de trace ne sur les stéroïdes qui est super utile quand debuging simultanées\code parallèle
https://www.youtube.com/watch?v=_vuMi-3jGwY