Правильный способ сделать Parallel.For для вычисления данных из массива

хочу: сумма х и сумма х * х. Где х = строка [я]. Поскольку более чем один поток хочет читать / писать в "sumAll» а также "sumAllQ» Мне нужно заблокировать его доступ. Проблема в том, что блокировка отчасти сериализует вещи здесь. Мне нужно разделить эту операцию на # "Environment.ProcessorCount» для циклов, каждый из которых суммирует одну часть массива и, наконец, суммирует свои результаты. Но как я могу сделать это программно?

Образец кода:

//line is a float[]
Parallel.For(0, line.Length,
new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount },
i =>
{
    x = (double)line[i];
    lock (sumLocker)
    {
        sumAll += x;
        sumAllQ += x * x;
    }
});

РЕДАКТИРОВАТЬ 1: Мэтью Уотсон ответить на результаты теста

Дома. Процессор Core 2 Quad Q9550 с тактовой частотой 2,83 ГГц:

Result via Linq:      SumAll=49999950000, SumAllQ=3,33332833333439E+15
Result via loop:      SumAll=49999950000, SumAllQ=3,33332833333439E+15
Result via partition: SumAll=49999950000, SumAllQ=3,333328333335E+15
Via Linq took: 00:00:02.6983044
Via Loop took: 00:00:00.4811901
Via Partition took: 00:00:00.1595113

На работе. CPU i7 930 2,8 ГГц:

Result via Linq:      SumAll=49999950000, SumAllQ=3,33332833333439E+15
Result via loop:      SumAll=49999950000, SumAllQ=3,33332833333439E+15
Result via partition: SumAll=49999950000, SumAllQ=3,333328333335E+15
Via Linq took: 00:00:01.5728736
Via Loop took: 00:00:00.3436929
Via Partition took: 00:00:00.0934209

Ответы на вопрос(2)

Ваш ответ на вопрос