Есть несколько возможностей.
Во-первых, в большинстве случаев Parallel.ForEach
не создаст новую тему. Он использует .NET 4 ThreadPool (все TPL поддерживает) и будет повторно использовать потоки ThreadPool.
При этом Parallel.ForEach использует стратегию секционирования, основанную на размере передаваемого ему списка. Мое первое предположение состоит в том, что ваш «внешний» список содержит много сообщений, но внутренний список имеет только один экземпляр Message, поэтому разделитель ForEach использует только один поток. С одним элементом Parallel
достаточно умен, чтобы просто использовать основной поток, а не крутить работу в фоновом потоке.
Обычно в подобных ситуациях лучше распараллеливать внешний цикл, а не внутренний цикл. Это обычно даст вам лучшую производительность (так как у вас будет больше рабочих элементов), хотя это трудно понять, не имея четкого представления о размерах цикла плюс размер единицы работы. Вы также можете, возможно, распараллелить как внутренние, так и внешние циклы, но без профилирования будет трудно сказать, какой вариант будет наилучшим.
Еще одна возможность:
Попробуйте использовать [Thread.ManagedThreadId][1]
вместо Thread.CurrentThread.Name для ведения журнала. Поскольку Parallel
использует потоки ThreadPool, «Имя» часто одинаково для нескольких потоков. Вы можете подумать, что используете только один поток, хотя на самом деле вы используете более одного ...