Как правило, это выполняется с помощью перегрузки Parallel.For , которая уже обеспечивает локальные данные потока.
Эта перегрузка позволяет вам предоставить инициализацию и делегат финализации, который фактически становится инициализацией для каждого потока для локальных данных вашего потока, и функцией сокращения в конце, чтобы "объединить" результаты вместе (который запускается один раз для потока ). Я подробно писал об этом здесь .
Основная форма - сделать что-то вроде:
object sync = new object();
double result = 0;
Parallel.For(0, collection.Count,
// Initialize thread local data:
() => new MyThreadSpecificData(),
// Process each item
(i, pls, currentThreadLocalData) =>
{
// Generate a NEW version of your local state data
MyThreadSpecificData newResults = ProcessItem(collection, i, currentThreadLocalData);
return newResults;
},
// Aggregate results
threadLocalData =>
{
// This requires synchronization, as it happens once per thread,
// but potentially simultaneously
lock(sync)
result += threadLocalData.Results;
});