Определение потоков, в которых Parallel.ForEach выполнялся в Concurrency Visualizer. - PullRequest
0 голосов
/ 09 апреля 2011

Я играю с визуализатором параллелизма в VS2010. Это отличная функция, но у меня возникают проблемы с определением потоков, в которых работал мой Parallel.ForEach. Я прилагаю скриншот здесь в надежде, что кто-то еще может помочь. Кроме того, кажется, что мое приложение работает последовательно? Обратите внимание на выполнение в основном потоке и только в одном другом рабочем потоке.

Примечание. Когда я сделал этот прогон, я установил ParallelOptions.MaxDegreeOfParallelism = Environment.ProcessorCount (= 2).

Любая помощь приветствуется!

enter image description here

1 Ответ

1 голос
/ 09 апреля 2011

Похоже, что ваше приложение использует основной поток (оно может выполнять встроенную работу в основном потоке) и переключаться между тремя рабочими потоками CLR в нижней части этого списка.Для разных частей ForEach нормально быть планировщиком в разных потоках.

Нажмите на один из зеленых (блоки выполнения в одном из этих потоков), чтобы проверить стек классов и посмотреть, действительно ли он работает на вашем ForEach,Вы должны увидеть что-то вроде:

System.Threading.Parallel...<PartitionerForEachWorker>...

в верхней части списка.

Вы также увидите, что серая панель маркеров сценария появляется сверху и снизу представления с надписью "Parallel.ForEach".«Это полезно для того, чтобы увидеть, где ваше приложение было на самом деле внутри кода, который вас интересует.

Изображение довольно маленькое, поэтому трудно сказать больше, хотя есть достаточное количество желтого цвета, указывающее на то, что ваши потоки вытесняются(перехвачено другой работой).Это может быть связано с тем, что вы делаете внутри цикла и / или с другими вещами, происходящими в вашем приложении.

Более подробную информацию об использовании профилировщика в параллельных приложениях можно найти здесь:

http://msdn.microsoft.com/en-us/library/ff963545.aspx

...