Использование Parallel.For

Как я могу сделать код ниже параллельным, без блокировок

List l = new List();        
foreach (var item in sourceCollection)
{
    L.Add(Process(item));
}

Я предпочитаю ответы для С# 3.5, но 4.0 тоже подойдет


person Delashmate    schedule 08.01.2011    source источник
comment
Было бы полезно, если бы вы сделали «возвращает значение» и «объединяет ...» немного более конкретным. Такие детали имеют значение (много).   -  person Henk Holterman    schedule 08.01.2011
comment
@ Хенк, я сделал некоторые уточнения в тексте вопросов.   -  person Delashmate    schedule 08.01.2011


Ответы (3)


Вот пример взятия последовательности чисел, выполнения некоторых дорогостоящих операций над каждым из них параллельно, а затем агрегирования результата (не параллельно).

int[] numbers = { 1, 1, 2, 3, 5, 8, 13 };
int[] squaredNumbers = new int[numbers.Length];
Parallel.For(0, numbers.Length, i => squaredNumbers[i] = (int)Math.Pow(numbers[i], 2));
int sum = squaredNumbers.Sum();

Просто будьте осторожны с безопасностью потоков в операции, которую вы выполняете в делегате.

person Allon Guralnek    schedule 08.01.2011

и объединить все выходные значения после завершения цикла

Если мы воспримем это буквально, проблем не будет, просто сохраните эти значения в (другом) массиве и обработайте/объедините их после цикла.

Но я подозреваю, что вы хотите объединить (добавить) их во время цикла. И то без блокировки.

Казалось бы, лучшим решением будет использовать не Parallel.For(), а решение LINQ .AsParallel().

person Henk Holterman    schedule 08.01.2011
comment
Я не против объединить их после завершения цикла, мне просто нужно элегантное решение. - person Delashmate; 08.01.2011

Используя PLINQ, предполагая, что порядок важен:

var result = sourceCollection
  .AsParalle()
  .AsOrdered()
  .Select(item => Process(item);

Я очень сомневаюсь, что вам нужны результаты в виде списка, но если бы вы это сделали, вы всегда могли бы преобразовать результат в список с помощью:

var L = result.ToList(); 
person cdiggins    schedule 02.09.2012