Как я могу сделать код ниже параллельным, без блокировок
List l = new List();
foreach (var item in sourceCollection)
{
L.Add(Process(item));
}
Я предпочитаю ответы для С# 3.5, но 4.0 тоже подойдет
Как я могу сделать код ниже параллельным, без блокировок
List l = new List();
foreach (var item in sourceCollection)
{
L.Add(Process(item));
}
Я предпочитаю ответы для С# 3.5, но 4.0 тоже подойдет
Вот пример взятия последовательности чисел, выполнения некоторых дорогостоящих операций над каждым из них параллельно, а затем агрегирования результата (не параллельно).
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();
Просто будьте осторожны с безопасностью потоков в операции, которую вы выполняете в делегате.
и объединить все выходные значения после завершения цикла
Если мы воспримем это буквально, проблем не будет, просто сохраните эти значения в (другом) массиве и обработайте/объедините их после цикла.
Но я подозреваю, что вы хотите объединить (добавить) их во время цикла. И то без блокировки.
Казалось бы, лучшим решением будет использовать не Parallel.For(), а решение LINQ .AsParallel().
Используя PLINQ, предполагая, что порядок важен:
var result = sourceCollection
.AsParalle()
.AsOrdered()
.Select(item => Process(item);
Я очень сомневаюсь, что вам нужны результаты в виде списка, но если бы вы это сделали, вы всегда могли бы преобразовать результат в список с помощью:
var L = result.ToList();