Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: DelashmateОтветов: 3

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

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

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

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

parallel-processing

Ответы

Ответ 1 · рейтинг 1 · Allon Guralnek

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

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();

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

Ответ 2 · рейтинг 1 · Henk Holterman

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

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

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

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

Ответ 3 · cdiggins

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

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

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

var L = result.ToList();

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы