Parallel.For的用法

时间:2011-01-08 17:28:38

标签: c# parallel-processing

如何在不使用锁

的情况下使代码平行
List l = new List();        
foreach (var item in sourceCollection)
{
    L.Add(Process(item));
}

我更喜欢c#3.5的答案,但4.0也可以

3 个答案:

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