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

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

0 голосов
/ 08 января 2011

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

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

Я предпочитаю ответы для c # 3.5, но 4.0 тоже будет в порядке

Ответы [ 3 ]

1 голос
/ 08 января 2011

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

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

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

1 голос
/ 08 января 2011

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

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

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

Лучшее решение - не Parallel.For(), а LINQ .AsParallel().

0 голосов
/ 02 сентября 2012

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

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

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

var L = result.ToList(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...