如何在不使用锁
的情况下使代码平行List l = new List();
foreach (var item in sourceCollection)
{
L.Add(Process(item));
}
我更喜欢c#3.5的答案,但4.0也可以
答案 0 :(得分:1)
并在循环结束后组合每个值输出
如果我们从字面上理解没有问题,只需将这些值存储在(另一个)数组中,然后在循环后处理/组合它们。
但我怀疑你想在循环中组合(添加)它们。然后没有锁定。
最佳解决方案似乎不是使用Parallel.For()
而是使用LINQ .AsParallel()
解决方案。
答案 1 :(得分:1)
这是一个采用一系列数字的例子,并行地对每个数字执行一些代价高昂的操作,然后聚合结果(不是并行)。
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 :(得分:0)
假设排序很重要,使用PLINQ:
var result = sourceCollection
.AsParalle()
.AsOrdered()
.Select(item => Process(item);
我非常怀疑您需要将结果作为列表,但如果您这样做,您总是可以通过以下方式将结果转换为列表:
var L = result.ToList();