加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 并行聚合集合

发布时间:2020-12-15 23:28:50 所属栏目:百科 来源:网络整理
导读:我见过基本类型的并行聚合代码,例如: Parallel.Forint(0,result.Count,() = 0,(i,loop,subtotal) = { subtotal += result[i]; return subtotal; },(x) = Interlocked.Add(ref sum,x)); 我想知道是否有一个列表/其他集合的等价物,例如: ListResult AllResul
我见过基本类型的并行聚合代码,例如:

Parallel.For<int>(0,result.Count,() => 0,(i,loop,subtotal) =>
    {
        subtotal += result[i];
        return subtotal;
    },(x) => Interlocked.Add(ref sum,x)
);

我想知道是否有一个列表/其他集合的等价物,例如:

List<Result> AllResults;
Parallel.ForEach(allIDs,(currentID) =>
{

    subList.add(GetResultFor(currentID));
    return subList;
},(x) =>
{
    lock(AllResults)
        AllResults.AddRange(subList);
};

我猜测没有什么好看和整洁,但我想不出另一种做法,当然不是通过一个标准的parralel.ForEach因为我不能想到你会怎么说“这个核心有这个范围,这个核心这个范围”….

解决方法

我认为在这两个示例中,PLINQ可以更好地为您服务,而无需在使用非线程安全集合时手动锁定.

您的总和计算可以转换为:

var sum = result.AsParallel().Sum();

第二个例子是List< T>可以转换为:

List<Result> results = allIDs.AsParallel()
                             .Select(id => GetResultFor(id))
                             .ToList();

注意并行性与测试所说的一样好.并不总是会并行加速代码,有时它甚至可能会降低顺序循环的性能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读