我怎样才能使下面的代码并行,没有锁?
List l = new List();
foreach (var item in sourceCollection)
{
L.Add(Process(item));
}我更喜欢c# 3.5的答案,但4.0也可以
发布于 2011-01-09 01:42:38
下面是一个获取一系列数字的示例,并行地对每个数字执行一些代价高昂的操作,然后聚合结果(而不是并行的)。
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();只需注意在委托中执行的操作中的线程安全。
发布于 2011-01-09 01:37:43
并合并循环结束后输出的每个值
如果我们从字面上理解这是没有问题的,只需将这些值存储在(Nother)数组中,并在循环后处理/组合它们。
但我怀疑您希望在循环期间组合(添加)它们。然后不加锁。
最好的解决方案似乎不是使用Parallel.For(),而是LINQ .AsParallel()解决方案。
发布于 2012-09-03 02:07:52
使用PLINQ时,假设排序很重要:
var result = sourceCollection
.AsParalle()
.AsOrdered()
.Select(item => Process(item);我非常怀疑您是否需要列表形式的结果,但如果需要,您可以通过以下方式将结果转换为列表:
var L = result.ToList(); https://stackoverflow.com/questions/4635147
复制相似问题