首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Parallel.For的用法

Parallel.For的用法
EN

Stack Overflow用户
提问于 2011-01-09 01:28:38
回答 3查看 434关注 0票数 0

我怎样才能使下面的代码并行,没有锁?

代码语言:javascript
复制
List l = new List();        
foreach (var item in sourceCollection)
{
    L.Add(Process(item));
}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-09 01:42:38

下面是一个获取一系列数字的示例,并行地对每个数字执行一些代价高昂的操作,然后聚合结果(而不是并行的)。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-01-09 01:37:43

并合并循环结束后输出的每个值

如果我们从字面上理解这是没有问题的,只需将这些值存储在(Nother)数组中,并在循环后处理/组合它们。

但我怀疑您希望在循环期间组合(添加)它们。然后不加锁。

最好的解决方案似乎不是使用Parallel.For(),而是LINQ .AsParallel()解决方案。

票数 1
EN

Stack Overflow用户

发布于 2012-09-03 02:07:52

使用PLINQ时,假设排序很重要:

代码语言:javascript
复制
var result = sourceCollection
  .AsParalle()
  .AsOrdered()
  .Select(item => Process(item);

我非常怀疑您是否需要列表形式的结果,但如果需要,您可以通过以下方式将结果转换为列表:

代码语言:javascript
复制
var L = result.ToList(); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4635147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档